В качестве чистого решения 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
Трубопроводы проходят слева направо. Точнее, процессы выполняются параллельно, но данные проходят слева направо: выходные данные команды слева становятся входами команды справа.
Здесь команда слева - это 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='
Эта команда будет искать foo
в файле filename
и в результатах для bar
:
grep foo filename | grep bar
Альтернативой будет awk:
awk '/ foo / && / bar /' filename
Вы можете использовать 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
.
вы можете умножить эти команды на разные переключатели командной строки, чтобы найти именно то, что вы ищете, используя более одного канала. Если вы можете подробно рассказать, что вы пытаетесь сделать с помощью своей команды, в исходном вопросе на простом английском языке, я или кто-то еще смогу вам помочь.
По сути, то, что вы пытаетесь сделать, является логическим И. 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
.
Для получения дополнительной информации см. Этот учебник