在 awk 命令中使用 bash script $1 参数

Use bash script $1 argument in awk command

我想创建一个 bash 脚本,它接受一个参数并使用 awk 打印 if

这是一个孤立进程:

#find_orphan.sh :

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

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

如果我 运行 这个不使用 $1 我的程序将运行 :

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

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

有什么帮助吗?

使用 awk -v var=val 将命令行值传递给 awk 并使用 [=13=] ~ val 语法使用正则表达式对其进行比较:

ps -elf | awk -v arg="" '[=10=] ~ arg && !/awk/ &&  == 1{print }'

没有正则表达式:

ps -elf | awk -v arg="" 'index([=11=], arg) && !/awk/ &&  == 1{print }'

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

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

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

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

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

pgrep 可以直接搜索具有特定 parent pid:

的进程
pgrep -P 1 ""

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

pgrep -l -P 1 ""

如果你想要完整的 command-line,你应该将 pids 传递给 ps 并告诉它只生成 cmd:

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

或者,如果您愿意,PID 和命令行:

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

(如果您想查看 headers 列,请省略 =。)


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

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

awk 'program' arg="" "filename"...

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

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