Как искать и печатать соответствующее значение соответствия из командной строки?

У меня ниже строки, например

2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text] 

Я хочу найти MATCH и напечатать его значение, 10, используя awk . Я могу сделать это, используя традиционный grep и cut но хочу найти способ с помощью sed или awk .

MATCH может находиться в любой позиции на линии.

2 Solutions collect form web for “Как искать и печатать соответствующее значение соответствия из командной строки?”

 sed -n 's/.* MATCH: \([^ ]*\).*/\1/p' 

Распечатал последовательность непространственных символов, которые будут следовать за самым правильным появлением " MATCH: " на каждой соответствующей строке.

-n говорит sed не печатать пространство шаблонов по умолчанию. И флаг p для команды s сообщает sed распечатать пространство шаблонов (так что результат замены), если замена выполнена успешно.

Итак:

 sed -n 's/pattern/replacement/p' 

является распространенной идиомой для печати результата успешных замещений.

Обратите внимание, что вышесказанное предполагает, что ввод является допустимым текстом. Так как .* Соответствует любой последовательности символов , она не будет соответствовать последовательностям байтов, которые не образуют действительных символов. Обычно это происходит в локалях UTF-8 при обработке текста в другой кодировке. Если вы в таком случае, вам может понадобиться префикс этой строки выше с помощью LC_ALL=C Это делает sed обрабатывать каждый байт как символ, поэтому нет возможной недействительной последовательности байтов. Это будет работать здесь, поскольку символы, которые мы сопоставляем, – все это из переносного набора символов.

Стандартный awk не имеет ничего эквивалентного, поскольку он не поддерживает группы захвата ( \(...\) записанные в \1 ) в его функции sub() .

Там вам нужно прибегнуть к функции match() :

 awk 'match($0, / MATCH: [^ ]*/) { print substr($0, RSTART+8, RLENGTH-8)}' 

Или используйте трюки типа:

 awk -F ' MATCH: ' 'NF>1 {sub(/ .*/, "", $2); print $2}' 

(будьте осторожны, что они рассмотрят самое левое появление " MATCH: " ).

GNU awk имеет функцию gensub() которая имеет функциональность, подобную команде sed , но ошибка дизайна в том, что она не говорит вам, была ли сделана какая-либо замена. Здесь вы можете сделать:

  gawk '(replacement = gensub(/.* MATCH: ([^ ]*).*/, "\\1", 1)) != $0 { print replacement}' 

Учитывая предположение, что все ваши строки сформированы одинаково (или, по крайней мере, все строки, содержащие MATCH: , похоже, что MATCH: является 5-м элементом строки, а требуемое значение – 6-й.

Поэтому в awk вам просто нужно проверить, соответствует ли 5-й элемент MATCH: и верните 6-й элемент строки, если это правильно.

 $ echo "2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text]" |awk -e '{ if ($5 == "MATCH:") print $6 }' 10 

EDIT: Учитывая предположение MATCH: может быть где угодно в строке:

  $ echo "2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text]" |awk -e '{ for (x=1; x<NF; x++ ) { if ($x == "MATCH:") {x=x+1; printf("%s\n", $x); break}}}' 10 

Не может быть очень изящным, но вам нужно пройти через все поля строки и проверить каждое поле, которое выполняется с помощью цикла for и теста if . Если поле теста соответствует, затем распечатайте следующее поле.

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

В многострочном файле:

 $ cat terst 2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text] 2017-01-19:31:51 [ABCD:] 37723 - MATCH: 11 [text] 2017-01-19:31:51 [ABCD:] 37723 - [text] 2017-01-19:31:51 37723 - MATCH: 12 [text] $ awk -e '{ for (x=1; x<NF; x++ ) { if ($x == "MATCH:") {x=x+1; printf("%s\n", $x); break}}}' terst 10 11 12 
  • сравнение 2 списков с дополнительными данными для печати
  • Удалить строки из файла с помощью awk или sed на основе переменной из предыдущей команды
  • Сравните два столбца файла
  • как удалить первое вхождение 0 в мм / дд с использованием sed?
  • вставить строку для отсутствующего значения
  • Заменить значение в одинарных кавычках в строке, содержащей определенное слово, используя команду sed
  • Обработка текста и экспорт содержимого на лист Excel
  • Удалите первые n байтов файлов
  • Добавление макроса TeX в начало файла с помощью sed (почему мой метод не работает?)
  • Задача сравнения регулярных выражений / шаблонов для извлечения данных
  • Можно ли изменить файл в директории только для чтения?
  • Interesting Posts

    Невозможно использовать глобальные shorcuts для приложений Python

    dd, искать с одним размером блока, писать с другим размером блока

    dm-crypt и включение пароля LUKS

    Что означает: & lt; i & gt; подставка для кода?

    Каков наилучший способ подключения к программе cron без TTY

    Как установить имя пользователя / пароль в Firefox при использовании прокси-сервера с auth?

    Как применить исправление уязвимости bash для CVE-2014-6271 на cygwin?

    Правильно отсоедините диск

    По какой-то причине «sudo ssh -w any -o Tunnel = ethernet root @ remote» создает туннельные устройства вместо устройств-кранов

    Как извлечь подмаски из строки и записать их в файл?

    Bash: укажите конкретный файл вместо меню выбора файла.

    Каковы системные требования для KDE?

    grep-шаблоны из файла1 в столбец file2

    команда для определения скорости процессора на машине zlinux

    После перезагрузки карта WiFi исчезает, но не после холодной загрузки

    Linux и Unix - лучшая ОС в мире.