2010-10-20 2 views
1

У меня есть два запросаЧто касается команды Grep

  1. Я делаю Grep и получить номер строки входного файла. Я хочу получить набор строк до и после номера строки из входного файла и перенаправить в файл/tmp/testout. как мне это сделать.

  2. У меня есть номера строк 10000,20000. Я хочу получить строки между 10000 и 20000 входного файла и перенаправить в файл/tmp/testout. как я могу DOI это

+1

В случае, если вы не знаете, существует сайт QIX для unix/linux: http://unix.stackexchange.com/ –

+0

Сайт суперпользователя - еще одна альтернатива. –

+0

И есть очень хороший сайт под названием StackOverflow, для которого это совершенно подходящий вопрос! –

ответ

8

для ГРЭП -C является прямым вариантом

для второго вопроса попробуйте это!

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

Как отмечено в комментарии к другому вопросу, ваш ответ работает только с GNU grep - POSIX grep не включает параметр '-C' (или '-A 'или' -B '). –

1

См head и/или tail.

Например:

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

в то время как аргумент хвоста (20000 - 10000).

1

Если вы используете GNU grep, вы можете поставить -B и -A, чтобы получить линии до и после матча с grep.

E.g.

grep -B 5 -A 10 SearchString File 

будет выдавать печать каждой строки, соответствующей SearchString из файла, плюс 5 строк до и 10 строк после соответствующей строки.

Для другой части вашего вопроса вы можете использовать head/tail или sed. Дополнительные сведения см. В других ответах.

+1

Только в GNU grep - POSIX grep не включает опции '-A' или '-B'. Поскольку один тег является «linux», вы не получаете ни единого голоса, но поскольку другой тег является «unix», я тоже не уверен в голосовании. Плюс это только ответы Q1, а не Q2. –

+0

@ Джонатан: Справедливая точка и спасибо, что оставили комментарий в любом случае. Я не ответил на вторую часть, поскольку это уже было охвачено. Я уточню вопрос, чтобы это отразить. –

2

Вы хотите изучить опции -A -B и -C grep. См 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

0

Для части 2, awk позволит напечатать диапазон строк таким образом:

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

Этот в основном дает диапазон на основе номера записи NR.

Для части 1 в контексте от grep можно использовать переключатели --after-context=X и --before-context=X. Если вы используете grep, что не позволяет этого, вы можете придумать сценарий awk, основанный на ответе на часть 2 выше.

+0

'NR> = 10000 {print} NR> 20000 {exit}' – ghostdog74

0

, чтобы увидеть до и после: (3 строки до и после 3 строки)

grep -C3 foo bar.txt 

второго вопрос:

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

вы можете сделать это только с AWK, например, дисплей 2 строки до и после "6", и диапазон индикации от LINENUMBER 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 
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 является Регул r выражение, которое вы ищете, и 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 
Смежные вопросы