【问题标题】:How to get bash variables work on awk pipe如何让 bash 变量在 awk 管道上工作
【发布时间】:2014-09-19 18:01:23
【问题描述】:

我无法从我的 bash 脚本中获取变量来处理 awk 管道。

SERVER_PORT="27018"
...
HOLDER=`netstat -tlpn | awk -v sp=$SERVER_PORT '/:sp */ {split($NF,a,"/"); print a[1]}'`

对该变量执行命令后,下一个等式为 TRUE!

...
if [ "$HOLDER" == "" ]; then
...

如果我跑

netstat -tlpn | awk '/:27018 */ {split($NF,a,"/"); print a[1]}'

在我的 shell 窗口上一切都很好,它给了我进程的 PID。

所以我的问题是:如何正确地将变量传递给 awk 或有什么东西坏了? 运行 CentOS 7

【问题讨论】:

    标签: linux bash shell unix awk


    【解决方案1】:

    在正则表达式常量中,awk 不会扩展变量。所以/:sp */ 字面意思是/:sp */

    您需要将其匹配为字符串:$0 ~ ":"sp" *"

    awk 脚本由pattern {action} 对组成。 /:27018 */ 是一种模式(使用正则表达式常量)。正如我在开始时所说,awk 不会在正则表达式常量内部扩展变量,因此/:sp */ 匹配那些文字字符。

    除了正则表达式常量之外,还有其他可能的模式。甚至静态字符串也可以是模式(它们总是正确的,但它们有效)。

    ~ 是 awk 中的正则表达式匹配运算符。您可以使用它来手动执行与正则表达式常量模式相同的匹配。 ~ 接受两个字符串参数。

    把它们放在一起,我们可以匹配 (~) 整行 ($0) 与 ":"sp" *" 的字符串常量正则表达式(而不是正则表达式常量)(字符串 ":",我们的变量 @987654334 @,以及字符串" *")。

    当放在一起时,你(正如我上面写的)$0 ~ ":"sp" *" 作为模式而不是正则表达式常量。

    【讨论】:

    • 我不太明白您在“匹配字符串:$0 ~ ":"sp" *"”下的意思。你能帮我解释一下吗?
    • @АртёмDoe 已编辑。希望能澄清事情。
    • @АртёмDoe 阅读gnu.org/software/gawk/manual/gawk.html#Regexp 并特别注意string constantsregexp constants 之间的区别以及Using Dynamic Regexps 部分。另外,如果您打算进行更多的 awk 编程,请阅读 Arnold Robbins 的《Effective Awk Programming, Third Edition》一书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2010-10-06
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多