【问题标题】:How to feed xargs to a piped grep for a piped cat command如何将 xargs 提供给管道 grep 以获取管道 cat 命令
【发布时间】:2019-02-18 05:12:16
【问题描述】:

如何将 xargs 提供给 piped grep 以获取 piped cat 命令。

命令 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'

问题是如何结合Command 1和Command 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

【问题讨论】:

  • 更好地描述样本输入和预期输出。请阅读MCVE
  • grep -f <(command 1) 你在找什么吗?

标签: bash shell grep command xargs


【解决方案1】:

grep 有一个选项-f。来自man grep

-f 文件,--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)。进程列表使用其输入运行或 输出连接到 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='%)

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多