【问题标题】:Use bash script $1 argument in awk command在 awk 命令中使用 bash 脚本 $1 参数
【发布时间】:2015-03-21 12:11:51
【问题描述】:

我想创建一个带有参数并使用awk 打印 if 的 bash 脚本

这是一个孤儿进程:

#find_orphan.sh :

ps -elf | awk '/$1/&&!/awk/ {if ($5 == 1){print $15}}'

不幸的是,我在将 $1 呈现为 bash 参数时遇到了问题..

如果我在不使用 $1 的情况下运行此程序,我的程序将正常运行:

ps -elf | awk '/some_program/&&!/awk/ {if ($5 == 1){print $15}}'

我真的需要能够在 bash 脚本参数中指定 awk 搜索模式。

有什么帮助吗?

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    使用awk -v var=val 将命令行值传递给awk,并使用$0 ~ val 语法使用正则表达式进行比较:

    ps -elf | awk -v arg="$1" '$0 ~ arg && !/awk/ && $5 == 1{print $15}'
    

    没有正则表达式:

    ps -elf | awk -v arg="$1" 'index($0, arg) && !/awk/ && $5 == 1{print $15}'
    

    【讨论】:

      【解决方案2】:

      Shell 变量仅在双引号(或根本没有引号)内扩展,而不是单引号。 你可以试试

      ps -elf | awk '/'$1'/&&!/awk/ {if ($5 == 1){print $15}}'
      

      对于 awk,我认为 anubhavas 解决方案更好,但这也适用于其他工具的类似情况。

      【讨论】:

      • 使用双引号可能会更好,以避免在扩展时分词,这可能会使 awk(和用户)更加困惑。 awk "/$1/&&!/awk/"'&&$5==1{ print $15 }'。注意引号从" 切换到'
      • 可能,我主要是想指出单引号和双引号在变量扩展方面的不同行为。
      • 没有。永远不要这样做,也不要在评论中建议使用双引号的废话。将 shell 变量的值传递给 awk 脚本的真正方法请参见 cfajohnson.com/shell/cus-faq-2.html#Q24
      【解决方案3】:

      注意:我知道这并没有解决标题中的问题;它是对文本中提出的实际问题的解决方案。关于awk的问题在下面回答。

      很少需要解析ps 输出,因为您可以要求ps 生成您想要的任何字段。此外,您会发现 pgrep 比使用 grepping ps 获取进程名称更容易使用和更可靠。 pgrep 默认安装在许多 Linux 发行版上;如果您没有安装它,请查看procps-ng homepage 进行下载。

      pgrep可以直接搜索具有特定父pid的进程:

      pgrep -P 1 "$1"
      

      这将打印出进程号(pids)列表;您也可以使用 -l 选项让它生成进程名称:

      pgrep -l -P 1 "$1"
      

      如果您想要完整的命令行,您应该将 pid 传递给 ps 并告诉它只生成 cmd

      pgrep -P 1 "$1" | xargs ps -ocmd=
      

      或者,如果您愿意,可以使用 PID 和命令行:

      pgrep -P 1 "$1" | xargs ps -opid=,cmd=
      

      (如果您想查看列标题,请忽略 =。)


      将命令行参数传递给awk 脚本的最佳方法是在命令行上设置一个变量。有两种方法可以做到这一点:

      awk -v arg="$1" 'program' "filename"...
      
      awk 'program' arg="$1" "filename"...
      

      两者之间的区别在于,第一种形式使argBEGIN 块中可用,而第二种形式在awk 打开文件之前解释,因此它在BEGIN 块中不可用,但可以为后续文件重新定义不同的:

      awk 'program' arg="value for file1" file1 arg="value for file2" file2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2021-05-02
        • 2017-03-08
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多