Я пытаюсь распечатать совпавшую строку и четвертую строку из совпавшей строки (строка, содержащая искомое выражение).
Я использовал следующий код:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Но это только печатает согласованную линию.
Это печатает только 4-ую строку.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Мне нужно напечатать как совпадающую строку, так и только 4-ю строку.
shell-script
Debal
источник
источник
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
делает именно то, что вы хотите, если я не понимаю вас</td>
не 4-й строкойОтветы:
В awk вы бы сделали это следующим образом
или
объяснение
Первое решение находит все совпадающие строки
pattern
. Когда он находит совпадение, он сохраняет номер записи (NR
) в массивеnr
. Он также хранит 4-ую записьNR
в том же массиве. Это сделаноnr[NR+4]
. Каждая запись (NR
) затем проверяется, чтобы увидеть, присутствует ли она вnr
массиве, если это так, запись распечатывается.Второе решение работает, по сути, таким же образом, за исключением того, что когда оно встречает,
pattern
печатает эту строку, а затем сохраняет четвертую запись перед ней в массивеnr
, а затем переходит к следующей записи. Затем, когдаawk
встретится с этой 4-й записью,NR in nr
блок будет выполнен и напечатает эту запись +4 после этого.пример
Вот пример файла данных
sample.txt
.Используя 1-е решение:
Используя 2-е решение:
источник
awk
ярлыков, не могли бы вы добавить краткое объяснение (такие вещи, как печать, подразумевается в awk, массивы ассоциативны и т. Д.)?Я просто добавляю удаление соответствующих строк перед печатью
{ 3,5d ; p }
.источник
sed: -e expression #1, char 18: unknown option to
s'`Вы можете попробовать
-A
параметр сgrep
, который определяет, сколько строк после соответствующей строки должно быть напечатано. Соедините это сsed
, и вы получите необходимые строки.grep -A 4 pattern input.txt | sed -e '2,4d'
Используя
sed
, мы удаляем из второй строки до четвертой.источник
pattern
в файле.Вот способ в Perl, который может иметь дело с произвольным числом совпадающих строк:
В перл. специальная переменная
$.
- текущий номер строки. Поэтому каждый раз, когда я нахожу совпадение строкpattern
, я печатаю его и сохраняю номер строки как$c
. Затем я печатаю снова, когда номер текущей строки на 4 больше, чем напечатанный ранее.источник
По сути, вы делаете поиск и замену. Вы можете добавить просто находку в одну и ту же команду, и она выведет их обоих :)
источник