[英]bash script needs to read user input and use it as the argument for another command
[英]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"...
两者之间的区别在于第一种形式使arg
在BEGIN
块中可用,而第二种形式在awk
打开文件之前解释,因此它在BEGIN
块中不可用,但可以为后续文件重新定义:
awk 'program' arg="value for file1" file1 arg="value for file2" file2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.