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

时间:2015-01-22 16:00:12

标签: linux bash shell awk

我想创建一个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搜索模式。

任何帮助?

3 个答案:

答案 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