使用SED匹配特定的字母并在其后打印单词

时间:2018-12-21 17:34:09

标签: bash shell awk sed

我有一个文件“ Log.txt”,如下所示:

 bla bla.. line1   
 bla bla.. line2  
 bla bla.. lineN     
:000000 ... 239e670... A  bla1.txt  
:000000 ... 76fd777... M  bla2.txt  
:000000 ... e69de29... A  bla3.txt 

假设我正在寻找字母“ A”和“ M”。

我将如何只在仅包含此特定字母的第4个字段或行中查找它。我只需要匹配单词“ A”和“ M”,然后打印文件名。即我需要得到如下的最终输出:

A   bla1.txt
M   bla2.txt
A   bla3.txt  

我用awk将第4列与A和M匹配,并打印下一个单词。但没有得到预期的输出。我也得到了额外的Bla Bla线。

任何人都知道如何使用sed实现这一目标吗?

4 个答案:

答案 0 :(得分:1)

awk

awk '$4 ~ /^[AM]$/ { print $4," ",$5 }' Log.txt

sed

sed -En '/^([^ ]+ ){3}[AM]/ { s/^([^ ]+ ){3}([AM] .*)/\2/; p; }' Log.txt

这两项都确认AM在第4字段中。

答案 1 :(得分:0)

Awk实际上可以完成您的工作,只需添加一个条件:

awk "/ (A|M) /{print $4,$5}" Log.txt

对于sed,您可以执行以下操作:

sed -nr "/ (A|M) /{s/.*((A|M)\s+.*)$/\1/;p}" Log.txt

不确定您的真实数据是什么样子,但我想您会明白并调整命令以适合它们的。

答案 2 :(得分:0)

根据您的输入文件和预期的输出,请在下面使用awk进行尝试:

awk '{if ($4 == "A" || $4 == "M") {print $4,$5}}' log.txt

输出:

A bla1.txt
M bla2.txt
A bla3.txt

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed 's/^\(\S*\s\)\{3\}\([AM]\s\)/\2/p;d' file

将第四个字段匹配为AM,如果是,则删除前三个字段并打印其余字段。