Необходимо 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