关于grep命令

时间:2010-10-20 07:11:19

标签: linux sed awk unix

我有两个问题

  1. 我做一个grep并获取输入文件的行号。我想从输入文件中检索行号之前和之后的一组行,并重定向到/ tmp / testout文件。我怎么能这样做。

  2. 我有一个行号10000,20000。我想检索输入文件的10000到20000之间的行,并重定向到/ tmp / testout文件。我该怎么做呢

8 个答案:

答案 0 :(得分:8)

表示grep -C是直接选项

第二个问题试试吧!

sed -n "100000,20000p" bar.txt > foo.txt 

答案 1 :(得分:2)

您想要查看grep的-A -B和-C选项。有关详细信息,请参阅man grep

   -A NUM, --after-context=NUM
          Print  NUM  lines  of  trailing  context  after  matching lines.
          Places  a  line  containing  --  between  contiguous  groups  of
          matches.

   -B NUM, --before-context=NUM
          Print NUM  lines  of  leading  context  before  matching  lines.
          Places  a  line  containing  --  between  contiguous  groups  of
          matches.

   -C NUM, --context=NUM
          Print  NUM lines of output context.  Places a line containing --
          between contiguous groups of matches.

要重定向输出,请执行以下操作:grep "your pattern" yourinputfile > /tmp/testout

答案 2 :(得分:1)

请参阅head和/或tail

例如:

head -n 20000 <input> | tail -n 10000 > /tmp/testout

而尾巴的参数是(20000 - 10000)。

答案 3 :(得分:1)

如果你正在使用GNU grep,你可以提供-B-A来获取与grep匹配之前和之后的行。

E.g。

grep -B 5 -A 10 SearchString File

将打印每行匹配来自File的SearchString以及之前的5行和匹配行之后的10行。

对于问题的其他部分,您可以使用head / tail或sed。请参阅其他答案了解详情。

答案 4 :(得分:0)

对于第2部分,awk将允许您打印一系列行:

awk 'NR==10000,NR==20000{print}{}' inputfile.txt >/tmp/testout

这基本上给出了基于记录号NR的范围。

对于第1部分,可以使用grep--after-context=X开关获取--before-context=X的上下文。如果您运行的grep不允许这样做,您可以根据上面的第2部分答案假设awk脚本。

答案 5 :(得分:0)

看前后:(前3行和后3行)

grep -C3 foo bar.txt

第二个问题:

head -20000 bar.txt | tail -10000 > foo.txt

答案 6 :(得分:0)

你可以用awk做这些,例如在“6”之前和之后显示2行,并显示从4到8的亚麻布

$ cat file
1
2
3
4
5
6
7
8
9
10

$ awk 'c--&&c>=0{print "2 numbers below 6: "$0};/6/{c=2;for(i=d;i>d-2;i--)print "2 numbers above 6: "a[i];delete a}{a[++d]=$0} NR>3&&NR<9{print "With range: ->"$0}' file
With range: ->4
With range: ->5
2 numbers above 6: 5
2 numbers above 6: 4
With range: ->6
2 numbers below 6: 7
With range: ->7
2 numbers below 6: 8
With range: ->8

答案 7 :(得分:0)

如果您的grep没有-A-B-C,那么此sed命令可能适合您:

sed -n '1bb;:a;/PATTERN/{h;n;p;H;g;bb};N;//p;:b;99,$D;ba' inputfile > outputfile

其中PATTERN是您要查找的正则表达式,99比您想要的上下文行数(相当于-C 98)大一个。

它通过在内存中保留一行窗口来工作,当正则表达式匹配时,输出捕获的行。

如果您的sed不喜欢分号并且更喜欢-e,则此版本可能适用于您:

sed -n -e '1bb' -e ':a' -e '/PATTERN/{h' -e 'n' -e 'p' -e 'H' -e 'g' -e 'bb}' -e 'N' -e '//p' -e ':b' -e '99,$D' -e 'ba' inputfile > outputfile

对于您的行范围输出,如果在范围结束后有大量行,则此功能将会更快完成:

sed -n '100000,20000p;q' inputfile > outputfile

sed -n -e '100000,20000p' -e 'q' inputfile > outputfile