在 bash/sed/awk 中提取文件的最后一个单词

Posted

技术标签:

【中文标题】在 bash/sed/awk 中提取文件的最后一个单词【英文标题】:Extract last word of a file in bash/sed/awk 【发布时间】:2014-08-01 07:17:15 【问题描述】:

我想在 bash/sed/awk 中提取文件的最后一个字,例如 a.txt

我该怎么做?

【问题讨论】:

【参考方案1】:

要获取最后一行的最后一个单词:

awk 'END print $NF' file

【讨论】:

【参考方案2】:

已更新。

如果您想使用awk 并确保有一个单词,请使用:

tac a.txt | awk 'NFprint $NF; exit'

tac 反向打印文件。 块前面的 NF 使其在该行不为空时起作用。在这种情况下,它会打印最后一个字段(NF 代表字段数,因此$NF 是最后一个),然后退出。

测试

$ cat a
hello my name
is blabla
and this is
my comment.
                      <--- note an empty line
$ tac a | awk 'NFprint $NF; exit'
comment.

或者也如suggested by Kent:

awk 'w=NF?$NF:w ENDprint w' file

w=$NF?$NF:w。这是一个三元运算符:如果NF&gt;0(没有空行),则将w 设置为最后一个字段。否则,保持原样。最后,在END 中,打印最后保存的单词。


如果你想用sed 来制作它,你可以使用它,以防最后没有空行:

sed -n '$s/.* //; p' a.txt

说明

$ 代表文件的最后一行。在这种情况下,请执行 中的内容。 s/.* //; p 删除直到最后一个空格的所有内容。然后打印p

【讨论】:

我猜他想要awk 'ENDprint $NF' file 这样的东西,我说like,因为文件的最后一行可能是空的。既然你是第一个来的,你可以做一些修复并完成答案。 Err 是真的,我确实理解错了。 Jotne 现在发布了他的答案,所以我将删除我的答案。 正如我所说,awk 'ENDprint $NF' file 并不总是有效。 +1 因为OP说没有空行,所以要容易得多。 ,我只想评论awk 'w=$NF?$NF:wENDprint w' file s/.* //; p 很好,除非行以空格结尾。我建议s/.* \([[:space:]]\1,\[[:space:]]*$/\1/;p 所以事件在最后一行有 1 个单词(或没有,但这取决于确切的要求)它可以工作【参考方案3】:

也试试这个 awk 命令,

awk -v RS="\0" 'print $NF' file

RS="\0" 将文件中的所有记录转换为单个记录。然后print $NF 打印该单条记录的最后一个字段。

【讨论】:

【参考方案4】:

你也可以使用sed命令,

$sed -nr '$s/.* (.*)$/\1/pg' File_name

【讨论】:

你应该把p放在s///的外面,否则如果最后一行没有至少2个字就会失败,在这种情况下不需要g,只有1个每行结束。最后,它失败了,最后一个位置是一个空格字符。【参考方案5】:

使用 tail 和 grep :

tail -1 myFile.txt | grep -oE '[^ ]+$'

【讨论】:

【参考方案6】:

您还可以通过greptail 获得最后一个字:

<a.txt grep -o '\w\+' | tail -n1

【讨论】:

【参考方案7】:

sed 变体支持空最后一行(如果有):

sed -n '/[^ ]/h; $g;s/ *$//; s/.* //p' a.txt

【讨论】:

【参考方案8】:

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

sed -r '/\w/s/.*\W(\w+)\W*$/\1/;h;$!d;x;/./!d' file

将当前行的最后一个单词保存在保持空间中,然后删除该行。在文件末尾,它检索最后一个单词并将其打印出来,除非没有单词,在这种情况下它会删除空行。

另一种方法是将整个文件 slurp 到内存中:

sed -r ':a;$!N;ba;s/.*\W(\w+)\W*$/\1/p;d' file

【讨论】:

【参考方案9】:
 sed -n '/^$/!$ s/.* \(\w*\)$/\1/p'

这将省略空行并在最后一个非空行打印最后一个单词。

/^$/!查找非空行 $ s/ 在最后一行替换 .* (\w*)$ 捕获 () 之间的任何内容 \1 替换行用于捕获组 () p 打印出来

【讨论】:

以上是关于在 bash/sed/awk 中提取文件的最后一个单词的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash脚本中使用Bash / Sed / Awk / Perl删除分隔字符串的最后一个元素[duplicate]

使用 bash、sed、awk 解析像 .ini 这样的文件

linux 如何批量提取文件最后几行

如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?

从CSV文件中提取最后一行,并将其放在另一个文件名为Python的文件中

在 Windows 10 批处理文件中,有没有办法只提取最后的总文件数?