Linux 如果时间戳大于一分钟,则打印
我有包含8个字段的输入行。像这样: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
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的值打印到文件中。我对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
,如果将约束更改为大于或等于1分钟,则可以删除该模式00:01:00
- 打印所需字段
用于漂亮的输出,可以删除列-t
xxx
,以使其更清晰。我将我的输入输入输入到这个awk命令中,它似乎确实起作用,但终端屏幕上没有打印任何内容,我希望至少有两个打印输出。谢谢,这让我更了解了awk可以做什么。@Jaywerman,我刚刚添加了一个测试示例,代码运行正常,看起来对我来说效果很好,你能告诉我什么不正常吗?嗯,当我创建自己的输入文件并将其交给awk时,它可以工作,但是当我尝试将echo ps-ef导入到同一个awk脚本中时,我正在写入awks结果的文件是空的。@Jaywerman,我添加了一个EDIT1解决方案,请检查一下,让我知道这是否对您有帮助?非常感谢您的帮助!我的bash脚本中有echo
之前的ps
!