Поиск внутри поиска

В качестве чистого решения awk, попробуйте:

tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'

Этот вариант печатает новую строку вывода только в том случае, если строка ввода отличается от предыдущей строки ввода.

В качестве небольшой вариации, этот вариант печатает новую выходную строку, только если эта выходная строка отличается от предыдущей:

tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'

Пример

Попробуем этот тестовый файл:

$ cat logfile
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 19 12
1 2 3 4 5 6 7 8 19 13
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 29

awk отфильтровывает дублирующиеся выходные строки:

$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}' 
1 4 9
1 4 19
1 4 29
3
12.04.2016, 02:02
4 ответа

Трубопроводы проходят слева направо. Точнее, процессы выполняются параллельно, но данные проходят слева направо: выходные данные команды слева становятся входами команды справа.

Здесь команда слева - это grep tool . Поскольку вы передаете один аргумент grep , он выполняет поиск в своем стандартном вводе. Поскольку вы не перенаправили стандартный ввод, grep читает с терминала: он ждет, когда вы введете.

Для поиска в файле используйте

grep tool path/to/file | …

Для рекурсивного поиска в каталоге используйте

grep -r tool path/to/directory | …

Вы можете отфильтровать результаты, чтобы перечислить только строки, содержащие embed = . Отбросьте параметры -l и -r , они не имеют смысла, когда ввод поступает со стандартного ввода.

grep -r tool path/to/directory | grep 'embed='

Здесь перечислены строки, содержащие как tool , так и embed = (в любом порядке). Альтернативный метод с более простой сантехникой - выполнить один поиск с шаблоном или; это всегда возможно, но если шаблоны могут перекрываться (не в данном случае), шаблон может стать очень сложным.

grep -E -r 'tool.*embed=|embed=.*tool' path/to/directory

Если вы хотите перечислить файлы , содержащие как tool , так и embed = , вам потребуется другая структура команд, с первым grep перечисляет имена файлов ( -l ), а второй получает эти имена файлов как аргументы , а не как входные. Преобразование стандартного ввода в аргументы командной строки для чего предназначена команда xargs .

grep -lZ -r tool path/to/directory | xargs -0 grep -l 'embed='
6
27.01.2020, 21:08

Эта команда будет искать foo в файле filename и в результатах для bar :

grep foo filename | grep bar

Альтернативой будет awk: awk '/ foo / && / bar /' filename

4
27.01.2020, 21:08

Вы можете использовать grep по-разному, например:

cat myfile | grep keyword

В этом примере выше файл будет выгружен в stdout . Вертикальная черта | возьмет этот вывод и передаст его команде grep keyword как stdin . В конце строки в myfile, содержащие ключевое слово , будут записаны в stdout , который обычно является экраном терминала. Это очень неэффективное использование ресурсов, того же результата можно достичь и с помощью этой команды:

grep keyword myfile

если вы хотите использовать grep в каскадном меннере, вот как это происходит:

grep keyword1 myfile | grep keyword2

На этот раз первая команда grep находит строки, содержащие keyword1 в myfile. Вторая команда grep берет выходные данные первой и ищет в них keyword2 . Фактически, вы ищете строки, содержащие как keyword1 , так и keyword2 в myfile .

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

2
27.01.2020, 21:08

По сути, то, что вы пытаетесь сделать, является логическим И. grep - это инструмент сопоставления строк, поэтому в терминах логики строки patter1 AND patter2 означают, что они будут на одной строке; при поиске в файле, где вы хотите найти строку с одним термином и другим в одной строке, вы можете использовать регулярное выражение grep 'pattern1. * pattern2' input_file.txt

$ ps -ef | grep 'xieerqi.*firefox'
xieerqi   5069  2616  7 17:43 ?        00:07:25 /usr/lib/firefox/firefox
xieerqi  24317  6901  0 19:22 pts/19   00:00:00 grep xieerqi.*firefox

В этом примере вместо поиска все процессы с моим именем пользователя, а затем соединяются с другим grep , который фильтрует процессы firefox .

Для получения дополнительной информации см. Этот учебник

1
27.01.2020, 21:08

Теги

Похожие вопросы