需要grep第一次出现多个字符串

com*_*eek 6 grep

我试图返回第一次出现多个字符串,即我想从下面的文本中选择第一次出现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
Run Code Online (Sandbox Code Playgroud)

这给了我所有的比赛:

grep '1259\|3009\|1589'  somelog.log
Run Code Online (Sandbox Code Playgroud)

而这只给了我第一场比赛

grep -m 1  '1259\|3009\|1589'  somelog.log
Run Code Online (Sandbox Code Playgroud)

我想返回以下内容:

ADWN    1259    11:00   B23

ADWN    3009    12:00   B19

ADWN    1589    14:20   B12
Run Code Online (Sandbox Code Playgroud)

我认为创建一个具有所需值的文件,然后循环遍历文件,将每个数字单独传递给grep命令将给我我想要的东西,但我还没有找到这样的例子.有没有一个简单的解决方案,循环是处理这个问题的最佳方法,还是已经在其他地方回答了这个例子?

提前感谢您的想法和建议 -

克莱德

Ste*_*eve 4

一种使用方法awk

awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt
Run Code Online (Sandbox Code Playgroud)

结果:

ADWN    1259    11:00   B23
ADWN    3009    12:00   B19
ADWN    1589    14:20   B12
Run Code Online (Sandbox Code Playgroud)

编辑:

我真的应该养成先阅读整个问题的习惯。我发现您正在考虑创建一个文件,其中包含您想要查找第一次出现的值。values.txt将它们放入一个名为每行一个值的文件中。例如; 这是以下内容values.txt

1259
3009
1589
Run Code Online (Sandbox Code Playgroud)

然后运行这个:

awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt
Run Code Online (Sandbox Code Playgroud)

结果:

ADWN    1259    11:00   B23
ADWN    3009    12:00   B19
ADWN    1589    14:20   B12
Run Code Online (Sandbox Code Playgroud)

第一条命令解释:

如果第二列 ( $2) 等于列出的这三个值之一,则将其添加到数组中(如果数组中尚不存在)。awk默认打印整行。

第二条命令解释:

FNR是相对于当前输入文件的记录数。
NR是记录总数。

FNR==NR { ... }构造仅适用于第一个输入文件。因此,对于 中的每一行values.txt,我们将整行 ( $0) 添加到一个数组(我将其称为数组,但您可以给它另一个名称)。next强制awk读取下一行values.txt(并跳过处理命令的其余部分)。当FNR==NR不再为真时,读取参数列表中的第二个文件。然后我们检查$2数组中的第二列 ( ),如果存在,则打印它并将其从数组中删除。通过使用,delete我们基本上将最大计数设置为一。