【问题标题】:Bash Scripting- Grep/Awk output as input to another scriptBash 脚本 - Grep/Awk 输出作为另一个脚本的输入
【发布时间】:2014-10-01 05:12:27
【问题描述】:

我有一个针对文件运行的脚本,它从用户那里获取参数并通过 grep 和 awk 发送以获取所需的列。它将返回多行。我想要做的是通过 grep|awk 的输出读取(或类似的东西)并通过另一个脚本(./lookup)运行它。我的问题是如何遍历每一行并通过脚本内的脚本运行该行上的内容。希望这是有道理的,我是脚本和 linux 的新手。

#!/bin/sh
x=$(grep "$*" "$c"|awk '{print $6}')
while read LINE   
do
./lookup $x
done

这似乎有效,但仅适用于输出的第一行。它还需要我按回车键来获取 ./lookup 脚本的输出。有什么想法或帮助吗?谢谢!

【问题讨论】:

    标签: linux bash shell loops awk


    【解决方案1】:

    grepawk 的输出通过管道输送到循环中:

    grep "$*" "$c" | awk '{print $6}' | while read LINE
    do
        ./lookup "$LINE"
    done
    

    顺便说一句,通常不需要同时使用grepawk,因为awk 可以进行正则表达式匹配。所以你可以写:

    awk -v re="$*" '$0 ~ re {print $6}' "$c" | while ...
    

    -v 选项设置awk 变量,~ 运算符执行正则表达式匹配。 $0 指的是整个输入行。

    【讨论】:

    • 我觉得$*这里指的是参数列表,会被shell插值
    • 我没有意识到,谢谢!我使用 $* 的理由是,如果输入了多个单词作为反对主脚本的参数(./find Los Angeles)。有没有更简单的方法来确保传递整个字符串?
    • 通常希望用户将参数括在引号中,例如./find 'Los Angeles'.
    【解决方案2】:

    你也可以使用 xargs 代替循环

    正如 barmar 所说,不需要 grep。

    awk -va="$*" '$0~a{print $6}' "$C" | xargs ./lookup
    

    【讨论】:

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