Необходимо grep для первых вхождений нескольких строк
Я пытаюсь вернуть первое вхождение нескольких строк, т. е. я хочу выбрать строки из следующего текста, где происходит первое вхождение 1259, 3009 и 1589.
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
DDWN 723 11:30 B04
ADWN 1589 14:20 B12
ADWN 1259 11:10 B23
DDWN 2534 13:00 B16
ADWN 3009 11:50 B14
это дает мне все матчи:
grep '1259|3009|1589' somelog.log
и это дает мне только первый матч
grep -m 1 '1259|3009|1589' somelog.log
Я хочу вернуть следующее:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
Я думаю, что создание файла с требуемыми значениями, А затем цикл через файл, передавая каждый номер отдельно в команде grep даст мне то, что я ищу, но я не нашел примера этого. Есть ли простое решение для этого, является ли цикл лучшим способом справиться с этим, или на этот пример уже ответили в другом месте?
заранее спасибо за ваши идеи и предложения--
Клайд
4 ответов
один из способов, используя awk
:
awk '!array[]++ && ~ /^1259$|^3009$|^1589$/' file.txt
результаты:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
edit:
я действительно должен привыкнуть сначала читать весь вопрос. Я вижу, что вы думаете о создании файла со значениями, которые вы хотели бы найти в первом вхождении. Поместите их в файл под названием values.txt
С одним значением на строку. Например, вот содержание values.txt
:
1259
3009
1589
затем запустите это:
awk 'FNR==NR { array[]++; next } in array { print; delete array[] }' values.txt file.txt
результаты:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
1-я команда объяснение:
если вторая колонка () равно одному из этих трех перечисленных значений, добавьте его в массив, если он еще не там.
awk
печать всей строки по умолчанию.
2-я команда объяснение:
FNR
- количество записей относительно текущего входного файла.NR
- общее количество записей.
в FNR==NR { ... }
construct имеет значение true только для первого входного файла. Поэтому для каждой из строк values.txt
добавляем всю строку () массиву (я назвал его массивом, но вы можете дать ему другое имя).
next
сил awk
читать следующую строку в values.txt
(и пропустить обработку остальной части команды). Когда FNR==NR
больше не true, читается второй файл в списке аргументов. Затем мы проверяем второй столбец () в массиве, если он там, распечатайте его и удалите из матрица. Используя
delete
мы по существу установить максимальное количество один.
вы можете использовать для каждого (см. сценарий оболочки Linux для каждого файла в каталоге возьмите имя файла и выполните программу) Для каждого шаблона, который вы хотите сопоставить, выполните отдельное объединение grep с выходным файлом
этот тоже будет работать.
for i in $(cut -d " " -f1 somelog.log | sort -u); do LC_ALL=C fgrep -m1 "$i" somelog.log; done
попробуйте это. Это может не работать в зависимости от вашей версии grep:
grep -m 1 -e pattern1 -e pattern2