как к grep два абзаца из файла?

у меня есть файл "test_file.txt". Мой вывод должен содержать все
"IP-АДРЕС" и "МЕСЯЦЫ 2017" из файла test_file.txt.

Server$
Server$cat test_file.txt 
IP ADDRESS:
1. 172.17.17.17
2. 172.17.17.18
3. 172.17.17.19

NEKI TEXT 2
1 one
2 two
3 three
4 four
5 five

MONTHS OF 2017:
01.  January   2017
02.  February  2017
03.  March     2017
04.  April     2017
05.  May       2017
06.  June      2017
07.  July      2017
08.  August    2017
09.  September 2017
10.  October   2017
11.  November  2017
12.  December  2017
Server$

Я нашел, egrep команда, но вывод не делает содержит все 12 Месяцев из файла.

Server$egrep -A3 "ADDRESS|MONTHS" test_file.txt
IP ADDRESS:
1 172.17.17.17
2 172.17.17.18
3 72.17.17.19
--
MONTHS OF 2017
01. January 2017
02. February2017
03. March 2017
Server$

Как я могу выполнить команду, которая может иметь 3 IP-адреса и 12 Месяцев в выводе?

1
задан 22 October 2019 в 16:43

3 ответа

Просто сделайте двойное egrep:

egrep -A3 "ADDRESS" test_file.txt && egrep -A12 "MONTHS" test_file.txt

Объяснение:

egrep -An распознал бы слово (и его строка) и взял бы n строки под тем словом благодаря -A, опция

test_file.txt является файлом, что мы хотим извлечь эти строки

"ADDRESS", и "MONTHS" искавшее слово, в "", оператор

&& просто выполняет каждую команду один за другим (но если 1rst не работал, 2-е не будет сделано!)

1
ответ дан 3 December 2019 в 06:49

Я использовал бы awk в режим абзаца (путем сбрасывания разделителя записей):

$ awk -vRS= '/^(IP ADDRESS|MONTHS)/' test_file.txt
IP ADDRESS:
1. 172.17.17.17
2. 172.17.17.18
3. 172.17.17.19
MONTHS OF 2017:
01.  January   2017
02.  February  2017
03.  March     2017
04.  April     2017
05.  May       2017
06.  June      2017
07.  July      2017
08.  August    2017
09.  September 2017
10.  October   2017
11.  November  2017
12.  December  2017

Perl имеет ту же функциональность:

 perl -00 -ne 'print if /^IP ADDRESS/ or /^MONTHS/' test_file.txt
3
ответ дан 3 December 2019 в 06:49

Это очень просто. Можно использовать ниже команды.

grep -E "172|01" file.sh

вывод как указано ниже:

1. 172.17.17.17
2. 172.17.17.18
3. 172.17.17.19
MONTHS OF 2017:
01.  January   2017
02.  February  2017
03.  March     2017
04.  April     2017
05.  May       2017
06.  June      2017
07.  July      2017
08.  August    2017
09.  September 2017
10.  October   2017
11.  November  2017
12.  December  2017

Объяснение:

, если бы Вы grep только для 172 затем вывод были бы

$ grep "172" file.sh
1. 172.17.17.17
2. 172.17.17.18
3. 172.17.17.19

, если Вы grep только для 01, затем

$ grep "01" file.sh
MONTHS OF 2017:
01.  January   2017
02.  February  2017
03.  March     2017
04.  April     2017
05.  May       2017
06.  June      2017
07.  July      2017
08.  August    2017
09.  September 2017
10.  October   2017
11.  November  2017
12.  December  2017

, Таким образом, Вам нужны оба из них сразу. Для поиска нескольких шаблонов мы должны использовать pipleline метасимвол (|) и так как это - часть расширенного regex, в котором мы нуждаемся -E опция.

Для узнавания больше опций для эти grep команда можно найти эта статья записанный мной полезный.

0
ответ дан 3 December 2019 в 06:49

Другие вопросы по тегам:

Похожие вопросы: