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

时间:2012-11-03 00:52:01

标签: 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

这给了我所有的比赛:

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命令将为我提供我想要的内容,但我还没有找到这样的示例。有没有一个简单的解决方案,循环是处理这个问题的最佳方法,还是已经在其他地方回答了这个例子?

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

克莱德

4 个答案:

答案 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