提取bash/sed/awk中文件的最后一个字
我想在bash/sed/awk中提取文件的最后一个字,比如提取bash/sed/awk中文件的最后一个字,bash,file,awk,sed,Bash,File,Awk,Sed,我想在bash/sed/awk中提取文件的最后一个字,比如a.txt 我该怎么做?已更新 如果要使用awk并确保有单词,请使用以下命令: tac a.txt | awk 'NF{print $NF; exit}' tac反向打印文件NF使其工作。在这种情况下,它打印最后一个字段(NF表示字段数,因此$NF是最后一个),然后退出 试验 w=$NF?$NF:w。这是一个三元运算符:如果NF>0(无空行),则将w设置为最后一个字段。否则,保持原样。最后,在END{}中,打印最后保存的单词 如果要使
a.txt
我该怎么做?已更新
如果要使用awk
并确保有单词,请使用以下命令:
tac a.txt | awk 'NF{print $NF; exit}'
tac
反向打印文件<当行不为空时,{}
块前面的code>NF使其工作。在这种情况下,它打印最后一个字段(NF
表示字段数,因此$NF
是最后一个),然后退出
试验
w=$NF?$NF:w
。这是一个三元运算符:如果NF>0
(无空行),则将w
设置为最后一个字段。否则,保持原样。最后,在END{}
中,打印最后保存的单词
如果要使用
sed
,可以使用此选项,以防末尾没有空行:
sed -n '${s/.* //; p}' a.txt
解释
代表文件的最后一行。在这种情况下,执行$
中的操作{}
删除所有内容直到最后一个空格。然后打印s/*/;p
p
awk 'END {print $NF}' file
也可以尝试此awk命令
awk -v RS="\0" '{print $NF}' file
RS=“\0”
将文件中的所有记录转换为单个记录。然后,{print$NF}
打印单个记录的最后一个字段。您也可以使用sed命令
$sed -nr '${s/.* (.*)$/\1/pg}' File_name
您还可以使用
grep
和tail
获取最后一个单词:
<a.txt grep -o '\w\+' | tail -n1
使用tail和grep:
tail -1 myFile.txt | grep -oE '[^ ]+$'
sed
支持空最后一行的变体(如果有):
这可能适用于您(GNU-sed):
将当前行的最后一个字保存在保留空间中,然后删除该行。在文件末尾,它检索最后一个单词并将其打印出来,除非没有单词,否则会删除空行
另一种方法是将整个文件读入内存:
sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
这将省略空行,并在最后一个非空行上打印最后一个单词
- /^$/!查找非空行
- $s/在最后一行替换
- .*(\w*)$捕获()
- \1个捕获组的替换行()
- p打印出来
我猜他想要类似于awk'END{print$NF}文件的东西
我说喜欢,因为文件的最后一行可能是空的。既然你是第一位,你可以做一些修正并完成答案。呃,没错,我理解错了。Jotne现在发布了他的答案,所以我将删除我的答案。正如我所评论的,awk'END{print$NF}文件
并不总是有效。+1因为OP说没有空行,所以更简单,我只想注释awk'{w=$NF?$NF:w}结束{print w}文件
s/*/;p
可以,除非行尾有空格。mya我建议s/*\([[:space:]\{1,\}[:space:]*$/\1/;p
so事件中有一行字(或没有,但这取决于确切的请求)在最后一行,它可以工作。你应该把p
放在s//
旁边,否则如果最后一行上没有至少2个单词,并且不需要g
,那么它就会失败。在这种情况下,每行只有1个结束。最后一行失败,最后一个位置是一个空格字符。
tail -1 myFile.txt | grep -oE '[^ ]+$'
sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt
sed -r '/\w/{s/.*\W(\w+)\W*$/\1/;h};$!d;x;/./!d' file
sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
sed -n '/^$/!{$ s/.* \(\w*\)$/\1/p}'