【问题标题】:print last two words of last line打印最后一行的最后两个字
【发布时间】:2015-05-06 20:49:23
【问题描述】:

我有一个返回几行输出的脚本,我正在尝试打印最后一行的最后两个单词(与输出中的行数无关)

$ ./test.sh

service is running..
check are getting done
status is now open..
the test is passed

我尝试如下运行,但它会打印每行的最后一个单词。

$ ./test.sh |  awk '{ print $NF }'

running..
done
open..
passed

如何使用awk 或sed 打印最后两个单词“已通过”?

【问题讨论】:

  • ./test.sh | tail -1 | grep -o '\w\+\s\+\w\+$',除非您必须使用 sed 和 Awk。

标签: awk sed cut


【解决方案1】:

只要说:

awk 'END {print $(NF-1), $NF}'

“正常”awks 存储最后一行 (but not all of them!),以便在到达 END 块时仍然可以访问它。

然后,打印倒数第二个和最后一个。这可以使用NF-1 和NF 技巧来完成。

【讨论】:

  • 是的,来自reference,尽管 POSIX 标准指定 NF 在 END 规则中可用。 然后我们读到 标准没有说$0 也被保留了.
  • 没错,也许像awk 'END{if (NF>=2) print $(NF-1), $NF; else print $NF}' 这样的东西更通用,可以防止这种极端情况。
【解决方案2】:

如果您的最后一行只能包含 1 个字段并且您的 awk 不保留 END 部分中的字段值,则为了稳健:

awk '{split($0,a)} END{print (NF>1?a[NF-1]OFS:"") a[NF]}'

【讨论】:

  • 我特别喜欢不说 print a,b 而是说 print a b 以防止在 NF==1 时打印 OFS 的技巧。再次 +1(我以前做过!)
【解决方案3】:

这可能对你有用(GNU sed):

sed '$s/.*\(\<..*\<.*\)/\1/p;d' file

这会删除文件中的所有行,但在最后一行它会用最后两个单词替换所有单词,如果成功则打印它们。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多