Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如果时间戳大于一分钟,则打印_Linux_Shell_Unix_Awk - Fatal编程技术网

Linux 如果时间戳大于一分钟,则打印

Linux 如果时间戳大于一分钟,则打印,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我有包含8个字段的输入行。像这样: Field1 Field2 Field3 Field4 Field5 Field6 Field7 Field8 name ID number stuff Jan15 ? 00:00:00 some command 其中一个字段Field7是时间戳,类似于so00:00:00 我想“扫描”第7个字段,看看时间是否大于一分钟,即第7个字段是否大于00:01:00 如果第7个字段较大,则我希望将字段2、7

我有包含8个字段的输入行。像这样:

Field1  Field2  Field3  Field4  Field5  Field6  Field7    Field8
name    ID      number  stuff   Jan15   ?       00:00:00  some command 
其中一个字段Field7是时间戳,类似于so
00:00:00
我想“扫描”第7个字段,看看时间是否大于一分钟,即第7个字段是否大于00:01:00


如果第7个字段较大,则我希望将字段2、7和8的值打印到文件中。我对awk几乎没有经验,但据我所知,这是我想要使用的工具。

假设您的文件是空格/制表符分隔的,这应该可以做到:

awk '$7!~/^(00:01:00|00:00)/{print $2,$7,$8}' file > out_file
EDIT1:要使用
ps
命令运行它,请像以下一样使用它:

ps -ef | awk '
{
  split($7,array,":")
  tot_time=array[2]*60+array[3]
  if(tot_time>60){
    print $2,$7,$8
  }
  tot_time=""
  delete array
}
'
另外,为了涵盖进程运行时间精确为1小时且小于1分钟的1种边缘情况:),请尝试以下操作

ps -ef | awk '
{
  split($7,array,":")
  tot_time=array[1]*3600+array[2]*60+array[3]
  if(tot_time>60){
    print $2,$7,$8
  }
  tot_time=""
  delete array
}
'


你能试试下面的吗。将第7列拆分为3个不同部分(小时、分钟和秒),分隔符为
,然后从中计算分钟,检查其值是否大于60

awk '
{
  split($7,array,":")
  tot_time=array[2]*60+array[3]
  if(tot_time>60){
    print $2,$7,$8
  }
  tot_time=""
  delete array
}
'   Input_file


使用样本进行测试:

运行代码后,输出如下

awk '
{
  split($7,array,":")
  tot_time=array[2]*60+array[3]
  if(tot_time>60){
    print $2,$7,$8
  }
  tot_time=""
  delete array
}
'  Input_file
xxx 00:01:01 xxx

假设字段由空格或制表符分隔,那么:

awk '$7 > "00:01:00" {print $2, $7, $8}' file
输入

name1   ID1      number1  stuff   Jan15   ?       00:00:59  somecommand1
name2   ID2      number2  stuff   Jan15   ?       00:01:00  somecommand2
name3   ID3      number3  stuff   Jan15   ?       00:01:01  somecommand3
name4   ID4      number3  stuff   Jan15   ?       00:02:00  somecommand4
ID3 00:01:01 somecommand3
ID4 00:02:00 somecommand4
输出

name1   ID1      number1  stuff   Jan15   ?       00:00:59  somecommand1
name2   ID2      number2  stuff   Jan15   ?       00:01:00  somecommand2
name3   ID3      number3  stuff   Jan15   ?       00:01:01  somecommand3
name4   ID4      number3  stuff   Jan15   ?       00:02:00  somecommand4
ID3 00:01:01 somecommand3
ID4 00:02:00 somecommand4
Awk主要将两个字符串比较为
字符串
,除非两者都是数字 值或一个是数字,另一个是数字字符串。
在这种情况下,执行
字符串比较
,然后您可以直接
比较HH:MM:SS表示中的时间字符串。

如果您有以下输入文件:

Field1  Field2  Field3  Field4  Field5  Field6  Field7    Field8
name    ID      number  stuff   Jan15   ?       00:00:14  somecommand
name2   ID2     number2 stuff   Jan15   ?       00:00:30  somecommand2
name3   ID3     number3 stuff   Jan15   ?       00:01:30  somecommand3
name4   ID4     number4 stuff   Jan15   ?       01:01:30  somecommand4
name5   ID5     number5 stuff   Jan15   ?       01:00:00  somecommand5
name6   ID6     number6 stuff   Jan15   ?       00:01:00  somecommand5
您可以使用以下
awk
命令

awk '$7 !~ /(^00:00|00:01:00)/ || NR==1 {print $2,$7,$8}' f.in | column -t
它将给出以下输出:

Field2  Field7    Field8
ID3     00:01:30  somecommand3
ID4     01:01:30  somecommand4
ID5     01:00:00  somecommand5
解释:

  • 基于正则表达式的方法
  • NR==1
    打印第一行(如果没有必要,您可以删除此部分)
  • 模式不是以
    00:00
    开始,或者不等于
    00:01:00
    ,如果将约束更改为大于或等于1分钟,则可以删除该模式
  • 打印所需字段
  • 列-t
    用于漂亮的输出,可以删除

请发布更清晰的输入和预期输出示例/示例,并从您的示例中删除
xxx
,以使其更清晰。我将我的输入输入输入到这个awk命令中,它似乎确实起作用,但终端屏幕上没有打印任何内容,我希望至少有两个打印输出。谢谢,这让我更了解了awk可以做什么。@Jaywerman,我刚刚添加了一个测试示例,代码运行正常,看起来对我来说效果很好,你能告诉我什么不正常吗?嗯,当我创建自己的输入文件并将其交给awk时,它可以工作,但是当我尝试将echo ps-ef导入到同一个awk脚本中时,我正在写入awks结果的文件是空的。@Jaywerman,我添加了一个EDIT1解决方案,请检查一下,让我知道这是否对您有帮助?非常感谢您的帮助!我的bash脚本中有
echo
之前的
ps