在 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>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】:您还可以通过grep
和tail
获得最后一个字:
<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 这样的文件
如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?