繁体   English   中英

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

[英]Use bash script $1 argument in awk command

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

有帮助吗?

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

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}'

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM