【问题标题】:How can I collapse this bash command line into an awk statement?如何将此 bash 命令行折叠成 awk 语句?
【发布时间】:2009-10-03 00:55:15
【问题描述】:

我创建了一个 awk 脚本并像这样使用它:

# grep -E "[PM][IP][DO][:S]" file.txt | awk-script

如何修改 awk 脚本以包含 grep 命令的工作(搜索“PID:”或“MPOS”?

awk 脚本是:

#!/usr/bin/awk -f
/Sleeve/  {
        printf("%8d, %7d, %7.2f, %7.2f, %7.2f\n", $5, $6, $7, $30, $31)
}
/Ambient/ {
        printf("%8d, %7d,,,, %7.2f, %7.2f\n", $5, $6, $7, $8)
}
/MPOS:/ {
        printf("%8d, %7d,,,,,, %5d, %5d\n", $4, $5, $2, $3)
}

【问题讨论】:

  • 鉴于您对 litb 的回答的评论,您为什么不向我们展示一些示例输入(包括应该和不应该匹配的行)。

标签: bash awk grep


【解决方案1】:

如果您只想搜索PID:MPOS,您可以说如果您没有在该行中找到它们,则可以跳过以下规则:

#!/usr/bin/awk -f

!/PID:|MPOS/ { 
        next 
}

/Sleeve/  {
        printf("%8d, %7d, %7.2f, %7.2f, %7.2f\n", $5, $6, $7, $30, $31)
}
/Ambient/ {
        printf("%8d, %7d,,,, %7.2f, %7.2f\n", $5, $6, $7, $8)
}
/MPOS:/ {
        printf("%8d, %7d,,,,,, %5d, %5d\n", $4, $5, $2, $3)
}

【讨论】:

  • 这在 ubuntu 中使用正宗的“awk”工作,但在我的嵌入式环境中(grep 和 awk 是“busybox”实现),我仍然感到悲伤。我什至尝试用“/PID:.*Sleeve/”替换“/Sleeve/”匹配但没有成功。我现在使用我原来的命令行被卡住了(没有困难)。
  • 如果!/PID:|MPOS/ 不起作用,请尝试!(/PID:/ || /MPOS/) {next}
  • 我应该指出,建议的语法“litb”很好——我的输入文件中有一些东西导致脚本以不可预测的方式运行。简单的测试文件显示脚本“litb”建议的作品(在busybox和其他)。
【解决方案2】:

我在busybox(在 Bash 中的 Ubuntu 上)尝试了 litb's 的答案,它对我有用。为了测试,我使用以下 shebang 来匹配我有符号链接到 busybox 的位置:

#!/home/username/busybox/awk -f

并使用以下命令运行测试:

./awk-script file.txt

我还在busybox sh 下进行了测试(使用PATH=/home/username/busybox:$PATH,尽管这不是必需的)并且它在那里工作。

当你说“我仍有悲伤”时。这意味着什么?您是否收到错误消息或不正确的结果?

顺便说一句,除非您正在搜索字符的所有排列,否则您可以像这样执行 grep:

grep -E "(PID:|MPOS)" file.txt

【讨论】:

  • 语法很好,它只是将输出截断为几十行,而不是我期望的 10K 以上(在嵌入式系统中运行时)。脚本和测试文件是相同的,命令行是在两个环境之间剪切和粘贴的。所以“悲伤”是指我在 Ubuntu 中得到令人愉悦的冗长结果,而在嵌入式中得到令人愉悦的截断结果。我相当确定文件中的某些内容可能是系统之间传输中引入的原因。不重要,grep 运行良好。 (+1 为 grep 提示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多