如何将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
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='%)