Как запустить и остановить печать строк с определенным текстом в Linux / Unix Terminal - PullRequest
0 голосов
/ 20 октября 2019

Печать файла на терминале. Запуск и окончание в строке с определенным текстом

Например: file.txt

2019/10/17 23:01:02 -W- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....

Я пытался отобразить строки с помощью grep cmd, но яневозможно получить требуемый вывод.

Ожидаемый результат: Команда для получения результатов на основе системной даты

> some command in grep (or) awk (or) sed with system date for current date

2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End

Ответы [ 3 ]

0 голосов
/ 20 октября 2019

Вот скрипт awk. С объяснением: Он также решит для печати частичных завершающих секций.

script.awk

BEGIN {FS=" -I- "}  # Field separator is " -I- ", therefore idicative field data is in fiedl $2
$2 ~ "^Start"{onSection = 1} # if indicative field start with "Start", mark section flag ON
onSection{print} # print output only if marked section flag ON
$2 ~"^End"{onSection = 0} # if indicative field ends with "End", mark section flag OFF

работает

awk -f script.awk file.txt

или один вкладыш:

awk 'BEGIN{FS=" -I- "}$2~"^Start"{f=1}f{print}$2~"^End"{f=0}' file.txt

выход

2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End
0 голосов
/ 21 октября 2019
sed -n '/Start$/,/End$/p' input

Для фильтрации по сегодняшней дате:

sed -n "\@$(date +%Y/%m/%d)@"'{ /Start$/,/End$/p; }' input
0 голосов
/ 20 октября 2019

Простой способ ввода awk - просто сохранить флаг и установить n = 1, когда "Start" встречается в поле 4 . Проверка n == 1 дает вам тест для печати каждой строки, в то время как n равен 1. Когда достигается "End", просто напечатайте эту строку и выйдите, например,

awk '$4 == "End" {print; exit} $4 == "Start" {n = 1} n == 1' file

( примечание: операция, связанная с правилом n == 1, является просто операцией по умолчанию print. Это эквивалентно записи n == 1 {print})

Пример использования / Вывод

Используя ваш файл данных в file, вы получите:

$ awk '$4 == "End" {print; exit} $4 == "Start" {n = 1} n == 1' file
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End

Его также можно записать в виде:

awk '$4 == "Start" {n = 1} n == 1; $4 == "End" {exit}' file

Изменить - только сегодняшняя дата

Если вы хотите сопоставить только сегодняшнюю дату, вам просто нужночтобы передать дату в нужном формате в виде переменной в оболочку awk из оболочки, используя опцию -v, например,

awk -v date="$(date +%Y/%m/%d)" '
    $1 == date { 
        if($4 == "Start") n = 1
        if(n == 1) {print}
        if($4 == "End") exit
    }
' file

Пример ввода

$ cat file
2019/10/17 23:01:02 -W- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -W- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Start
2019/10/20 23:01:02 -I- ======================
2019/10/20 23:05:02 -I- Summary Details
2019/10/20 23:10:02 -I- End
2019/10/20 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:10:02 -I- Blah Blah Blah.....

Пример использования / вывода (для 2019/10/20)

$ awk -v date="$(date +%Y/%m/%d)" '
>     $1 == date {
>         if($4 == "Start") n = 1
>         if(n == 1) {print}
>         if($4 == "End") exit
>     }
> ' file
2019/10/20 23:01:02 -I- Start
2019/10/20 23:01:02 -I- ======================
2019/10/20 23:05:02 -I- Summary Details
2019/10/20 23:10:02 -I- End

Дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...