у меня есть файл "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 Месяцев в выводе?
Просто сделайте двойное egrep
:
egrep -A3 "ADDRESS" test_file.txt && egrep -A12 "MONTHS" test_file.txt
Объяснение:
egrep -An
распознал бы слово (и его строка) и взял бы n строки под тем словом благодаря -A
, опция
test_file.txt
является файлом, что мы хотим извлечь эти строки
"ADDRESS"
, и "MONTHS"
искавшее слово, в ""
, оператор
&&
просто выполняет каждую команду один за другим (но если 1rst не работал, 2-е не будет сделано!)
Я использовал бы 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
Это очень просто. Можно использовать ниже команды.
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
команда можно найти эта статья записанный мной полезный.