我想创建一个bash脚本,它接受一个参数并使用awk
来打印if
这是一个孤儿过程:
#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搜索模式。
任何帮助?
答案 0 :(得分:6)
使用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}'
答案 1 :(得分:2)
Shell变量仅在双引号内(或根本没有引号)扩展,而不是单引号。 你可以试试
ps -elf | awk '/'$1'/&&!/awk/ {if ($5 == 1){print $15}}'
对于awk,我认为anubhavas解决方案更好,但这也适用于与其他工具类似的情况。
答案 2 :(得分:0)
注意:我知道这并没有解决标题中的问题;它是解决文本中提出的实际问题的方法。关于awk的问题将在下面解答。
很少需要解析ps
输出,因为您可以要求ps
生成您想要的任何字段。此外,您会发现pgrep
比使用ps
为进程名称更容易使用更可靠。默认情况下,许多Linux发行版都安装了pgrep
;如果没有安装在您的上,请查看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"...
两者之间的区别在于第一个表单使arg
块中的BEGIN
可用,而第二个表单在awk
打开文件之前解释,因此它不可用在BEGIN
块中,但可以为后续文件重新定义:
awk 'program' arg="value for file1" file1 arg="value for file2" file2