如何将xargs提供给管道grep用于管道猫命令

问题描述 投票:1回答:1

如何将xargs提供给管道grep用于管道猫命令。

命令1 :(生成具有特定日期时间的唯一PID的grep模式,从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
bash shell grep command xargs
1个回答
3
投票

grep有一个选项-f。来自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

shell具有避免必须创建临时文件的语法。 <()。来自man bash

流程替代

支持命名管道(FIFO)的系统或命名打开文件的/ dev / fd方法支持进程替换。它采用<(list)或>(list)的形式。运行进程列表时,其输入或输出连接到FIFO或/ dev / fd中的某个文件。作为扩展的结果,此文件的名称作为参数传递给当前命令。如果使用>(列表)表单,则写入文件将为列表提供输入。如果使用<(list)表单,则应读取作为参数传递的文件以获取列表的输出。

所以你可以把它结合到:

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='%)
© www.soinside.com 2019 - 2024. All rights reserved.