我试图返回第一次出现的多个字符串,即我想从下面的文本中选择第一次出现1259,3009和1589的行。
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
DDWN 723 11:30 B04
ADWN 1589 14:20 B12
ADWN 1259 11:10 B23
DDWN 2534 13:00 B16
ADWN 3009 11:50 B14
这给了我所有的比赛:
grep '1259\|3009\|1589' somelog.log
这只给了我第一场比赛
grep -m 1 '1259\|3009\|1589' somelog.log
我想返回以下内容:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
我认为创建一个具有所需值的文件,然后循环遍历文件,将每个数字单独传递给grep命令将为我提供我想要的内容,但我还没有找到这样的示例。有没有一个简单的解决方案,循环是处理这个问题的最佳方法,还是已经在其他地方回答了这个例子?
提前感谢您的想法和建议 -
克莱德
答案 0 :(得分:4)
使用awk
的一种方式:
awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt
结果:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
<强> 编辑: 强>
我应该养成先阅读整个问题的习惯。我看到你正在考虑使用你想要找到第一次出现的值来创建一个文件。将它们放在名为values.txt
的文件中,每行一个值。例如;这是values.txt
的内容:
1259
3009
1589
然后运行:
awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt
结果:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
第一个命令解释:
如果第二列($2
)等于列出的这三个值中的一个,则将其添加到数组中(如果它尚未存在)。 awk
默认打印整行。
第二命令解释:
FNR
是相对于当前输入文件的记录数
NR
是记录总数。
FNR==NR { ... }
构造仅适用于第一个输入文件。因此,对于values.txt
中的每一行,我们将整行($0
)添加到数组中(我称之为数组,但您可以给它另一个名称)。 next
强制awk
读取values.txt
中的下一行(并跳过处理命令的其余部分)。当FNR==NR
不再为true时,将读取参数列表中的第二个文件。然后我们检查数组中的第二列($2
),如果它在那里,打印它并从数组中删除它。通过使用delete
,我们基本上将最大数量设置为1。
答案 1 :(得分:0)
你可以使用每个(见Linux Shell Script For Each File in a Directory Grab the filename and execute a program) 对于要匹配的每个模式,执行与输出文件连接的单独grep
答案 2 :(得分:0)
这个也可以。
for i in $(cut -d " " -f1 somelog.log | sort -u); do LC_ALL=C fgrep -m1 "$i" somelog.log; done
答案 3 :(得分:-1)
试试这个。根据你的grep版本,它可能不起作用:
grep -m 1 -e pattern1 -e pattern2