У меня есть файл с записями с разделителем ('|'). Мне нужно найти определенную строку только в 6-м столбце, а затем вернуть всю строку через утилиту grep. Всего 10 колонн и, следовательно, 9 труб. В приведенных ниже строках примера мне нужно найти «G50483», должна быть возвращена только вторая запись.

3DEAC-9AF7-4EEE-9ACD-A6E376C5727C | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D ||Y| 610535 | DEFERRAL-TASK CLAIMED | RON BOW - ORD  Arv 10-SEP-2015 20:48, BOW-Line 2      Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 1G50483 every 50FH to ensure no       additional damage is present|| GMT |11-SEP-11

26BDF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED |RON BOW - ORD  Arv 25-SEP-2015 21:46, BOW-Line 6      Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N G50483 every 50FH to ensure no        additional damage is present || GMT | 27-SEP-10

G50483 26B2F1DF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED | RON BOW - ORD  Arv 25-SEP-2015 21:46, BOW-Line 6       Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 3G50483 every 50FH to ensure no       additional damage is present|| GMT | 27-SEP-05

2 ответа2

0

В Unix вам нужно выбрать правильный инструмент для работы, поскольку он предоставляет вам инструментарий. grep работает на целые строки. Используйте вместо этого awk:

awk -F "|" '$6 ~ /G50483/ { print $2; }'
  • -F является полевым сепаратором "|" в этом случае
  • $6 - столбец для шаблона поиска
  • ~ соответствует шаблону (вы можете использовать == для точного соответствия)
  • /pattern/ шаблон поиска
  • $2 - 2-е поле ($0 будет всей строкой)

Больше информации здесь:Эффективное программирование AWK - 4e.

0

Если это должен быть grep:

grep -Em2 "([^|]+|){6}[^|]+G50483.*' file | tail -n1
  • -E активирует расширенные регулярные выражения
  • -m2 останавливается на втором матче
  • '...' регулярное выражение
    • [^|]+| ищет один или несколько (+) символов, которые не являются конвейером | сопровождаемый трубой.
    • (...){6} это делается 6 раз подряд, поэтому мы сейчас находимся в 7-м поле. В вашем вопросе упоминается 6-е поле, но я принял 7-е поле из-за примера ввода. Измените его на {5} если хотите.
    • [^|]+ теперь мы снова ищем символы, которые не являются конвейерами, до окончательного шаблона поиска:
    • G50483 фактическая картина
  • tail -n1 необходим, потому что один только grep не может печатать только n-й случай, tail режет другой случай, который только 2-й оценивает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .