在 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"...
两者之间的区别在于第一种形式使 arg
在 BEGIN
块中可用,而第二种形式是在 awk
打开文件之前解释的,因此它是在 BEGIN
块中不可用,但可以为后续文件重新定义不同:
awk 'program' arg="value for file1" file1 arg="value for file2" file2
我想创建一个 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"...
两者之间的区别在于第一种形式使 arg
在 BEGIN
块中可用,而第二种形式是在 awk
打开文件之前解释的,因此它是在 BEGIN
块中不可用,但可以为后续文件重新定义不同:
awk 'program' arg="value for file1" file1 arg="value for file2" file2