Как передать xargs в piped grep для команды piped cat - PullRequest
0 голосов
/ 13 сентября 2018

Как передать xargs в пипетированный grep для команды piped cat .

Команда 1: (Создает шаблон grep с уникальными идентификаторами PID для конкретной даты и времени, считывается из runtime.log)

cat runtime.log | grep -e '2018/09/13 14:50' | awk -F'[ ]' '{print $4}' | awk -F'PID=' '{print $2}' | sort -u | xargs -I % echo '2018/09/13 14:50.*PID='%

Вывод вышеуказанной команды (Это собственный шаблон grep):

2018/09/13 14:50.*PID=13109
2018/09/13 14:50.*PID=14575
2018/09/13 14:50.*PID=15741

Команда 2: (Читает runtime.log и извлекает соответствующие строки на основе шаблона grep (в идеале шаблон grep должен исходить из команды 1))

cat runtime.log | grep '2018/09/13 14:50.*PID=13109'

Вопрос в том Как объединить как Команду 1, так и Команду 2

Ниже комбинированная версия команды не дает ожидаемого результата (В произведенном выводе были строки с датой, отличной от '2018/09/13 14: 50 ')

cat runtime.log | grep -e '2018/09/13 14:50' | awk -F'[ ]' '{print $4}' | awk -F'PID=' '{print $2}' | sort -u | xargs -I % echo '2018/09/13 14:50.*PID='% | cat runtime.log xargs grep

1 Ответ

0 голосов
/ 13 сентября 2018

grep имеет опцию -f.From man grep:

-f FILE, --file = FILE
Получать шаблоны из FILE, по одному на строку.Пустой файл содержит ноль шаблонов и поэтому ничего не соответствует.(-f определяется POSIX.)

Таким образом, вы можете использовать

cat runtime.log | grep -e '2018/09/13 14:50' | awk -F'[ ]' '{print $4}' | awk -F'PID=' '{print $2}' | sort -u | xargs -I % echo '2018/09/13 14:50.*PID='% > a_temp_file
cat runtime.log | grep -f a_temp_file

В оболочке есть синтаксис, позволяющий избежать создания временного файла.<()man bash:

Подстановка процессов

Подстановка процессов поддерживается в системах, которые поддерживают именованные каналы (FIFO) или метод / dev / fd для именования открытых файлов.Он принимает форму <(список) или> (список).Список процессов запускается с его входом или выходом, подключенным к FIFO или некоторому файлу в / dev / fd.Имя этого файла передается в качестве аргумента текущей команде в результате расширения.Если используется форма> (список), запись в файл обеспечит ввод для списка.Если используется форма <(list), файл, переданный в качестве аргумента, должен быть прочитан для получения вывода списка. </p>

Таким образом, вы можете объединить его с:

cat runtime.log | grep -f <(cat runtime.log | grep -e '2018/09/13 14:50' | awk -F'[ ]' '{print $4}' | awk -F'PID=' '{print $2}' | sort -u | xargs -I % echo '2018/09/13 14:50.*PID='%)
...