2014-12-16 2 views
0

Представьте меня есть файл журнала или текстовый файл, как показано нижеКак напечатать несколько строк, используя grep и sed?

16 Dec 2014 11:20:00 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight just cleaned up 
16 Dec 2014 11:22:01 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight is in queue 
16 Dec 2014 11:23:02 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight passengers loaded 
16 Dec 2014 11:24:03 [INFO] com.example.Test.State.java PlaneName: JetAirways360 This flight ready to take off 
16 Dec 2014 11:25:00 [INFO] com.example.Test.State.java PlaneName: JetAirways360 This flight took off 
17 Dec 2014 11:25:00 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight returned back 

Теперь представьте, я этот лог-файл полностью заполнялись много полетной информации. он, как известно, находит конкретную информацию о рейсе. Теперь я хотел бы grep, чтобы увидеть следующие данные:

16 Dec 2014 11:20:00 This flight just cleaned up 
16 Dec 2014 11:22:01 This flight is in queue 
16 Dec 2014 11:23:02 This flight passengers loaded 
16 Dec 2014 11:24:03 This flight ready to take off 
16 Dec 2014 11:25:00 This flight took off 
17 Dec 2014 11:25:00 This flight returned back 

Как это сделать, используя команду grep и sed ?.

+0

Это работало для меня 'Grep lofFile 'JetAirways360' | sed -e 's/\ (. * \) \ [INFO. * JetAirways360 \ (. * \)/\ 1 \ 2/g''. Добавлено подробное объяснение ниже. –

ответ

0
grep 'JetAirways360' lofFile | sed -e 's/\(.*\) \[INFO.*JetAirways360\(.*\)/\1 \2/g' 

Чтобы это объяснить.

  1. Во-первых, я собираю все записи журнала, в которых есть JetAirways360.
  2. Я использую sed. каждая скобка () - это то, что я пытаюсь получить из журнала. \ 1 для первого (.) и \ 2 для второго (. *). Подобные инструкции печати для строкового значения i вырезаны из исходной строки.

Детали:

  1. СЕПГ регулярное выражение должно содержать от этого S// г
  2. \ 1 и \ 2 являются операторы печати для (*.).
  3. (. ) представлен в виде (.). Последовательность эвакуации
  4. s /(.*) [INFO This Explains Поместите все символы в круглую скобку, пока не увидите [INFO (у меня есть escape-символ \ для [и, следовательно, [INFO). Вот как я получил выбранную дату и распечатал с помощью \ 1
  5. [INFO. JetAirways360 (.) Это объясняет, увидев, что [INFO начинает игнорировать до появления JetAirways360. После чего положить все оставшиеся символы в скобки. Вот как я получил сообщение, выбранный журнал и распечатаны с помощью \ 2
+0

Это отлично сработало для меня –

2

Это может работать для вас (GNU СЭД):

sed -rn '/JetAirWays360/s/(.{21}).{54}/\1/p' file 

Это экономит первую часть файла в задней ссылки и заменяет часть оставшегося файла с ним.

+0

Это немного зависит от мухи, но это очень приятное решение! – JJoao

+0

Было бы неплохо объяснить, что здесь {21} и {54}. Если я могу понять команду, которую я могу изменить для разных ситуаций. Спасибо –

+0

@RaviKrishnaP '. {21}' означает пробел, занятый 21 символом, который в приведенном вами примере является «16 декабря 2014 года 11:20:00» для первой строки. – potong

1

Это просто сделать с awk файла

awk -F" [[]|JetAirways360 " '{print $1,$3}' file 
16 Dec 2014 11:20:00 This flight just cleaned up 
16 Dec 2014 11:22:01 This flight is in queue 
16 Dec 2014 11:23:02 This flight passengers loaded 
16 Dec 2014 11:24:03 This flight ready to take off 
16 Dec 2014 11:25:00 This flight took off 
17 Dec 2014 11:25:00 This flight returned back 
+1

Я бы никогда не проложил шаблон поиска в FS! Хорошо! – JJoao

+0

Не могли бы вы объяснить мне команду здесь. Это поможет мне понять использование. Спасибо –

+1

@RaviKrishnaP Этот '' [[] | JetAirways360 '' используется '' '' или 'JetAirways360' как разделители полей, затем напечатайте поле номер '1' и' 3'. '' '' Должен находиться в групповых символах, подобных этому, чтобы работать '[[]'. Это '|' означает или. Просто нормальное 'регулярное выражение' в' FS' – Jotne

0

Есть много способов сделать это с помощью SED команды ниже работает.

sed 's#\([[:digit:]]\{2,2\}.*[[:digit:]]\{2,2\}:[[:digit:]]\{2,2\}:[[:digit:]]\{2,2\}\).*PlaneName.*JetAirways360 \(.*\)#\1 \2#g' 'my_log_file' 

Он отмечает первые две цифры в строке до времени полета и помнит об этом. sed затем ищет строку для JetAirways360, и после этого имени она отмечает оставшуюся часть строки. Затем два шаблона объединяются.

Использование Grep и вырезать

Еще проще трюк сделать это без использования Grep или СЭД использует «вырезать» (хотя это может быть не не относятся к ответу на ваш вопрос)

cut -d ' ' -f1-4,9- 'my_log.txt' 

из поле (столбец в данном случае) от 1 до 4 печатается, а затем поле 9 и далее

результатов, используя «вырезать»

16 Dec 2014 11:20:00 This flight just cleaned up 
16 Dec 2014 11:22:01 This flight is in queue 
16 Dec 2014 11:23:02 This flight passengers loaded 
16 Dec 2014 11:24:03 This flight ready to take off 
16 Dec 2014 11:25:00 This flight took off 
17 Dec 2014 11:25:00 This flight returned back 

Примечание: это просто сокращает нужные столбцы и не выводит grepping, и не участвует «sedding».

Вы также можете использовать Grep для имени Plane, которая будет печатать все строки с именем плоскости, а затем использовать «вырезать»

пример

grep "JetAirways36" 'my_log.txt'|cut -d ' ' -f1-4,9- 
0
perl -ne 'print if s!.INFO.*Name: JetAirways360!!' file 

Если вы предпочитаете новый команда flygrep:

#!/usr/bin/perl -n 
BEGIN{ $fl = shift;} 
print if s!.INFO.*Name: $fl !! 

Использование: flygrep JetAirways360 file

1
sed -n '/\[.*JetAirways360/ s///p' YourFile 

должны делать свою работу на основе вашего образца

Смежные вопросы