Linux 如何使用awk打印路径文件名的尾部
我搜索过,但没有成功 我有一个Paths的文件。 我想打印所有路径的尾部。 例如(对于文件中的每一行): 有人知道怎么做吗Linux 如何使用awk打印路径文件名的尾部,linux,awk,Linux,Awk,我搜索过,但没有成功 我有一个Paths的文件。 我想打印所有路径的尾部。 例如(对于文件中的每一行): 有人知道怎么做吗 谢谢这个awk echo "/homes/work/abc.txt" | awk '{sub(/.*\//,x)}1' abc.txt 由于*是贪婪的,它将一直持续到最后一次/ 所以在这里,我们用x删除所有直到最后一个/,因为x是空的,所以不提供任何内容 雷神版 echo "/homes/work/abc.txt" | awk -F/ '$0=$NF' abc.txt
谢谢这个
awk
echo "/homes/work/abc.txt" | awk '{sub(/.*\//,x)}1'
abc.txt
由于*
是贪婪的,它将一直持续到最后一次/
所以在这里,我们用
x
删除所有直到最后一个/
,因为x
是空的,所以不提供任何内容
雷神版
echo "/homes/work/abc.txt" | awk -F/ '$0=$NF'
abc.txt
注意:对于/homes/work/0
或0,0
等,这将失败,因此最好使用:
echo "/homes/work/abc.txt" | awk -F/ '{$0=$NF}1'
awk
解决方案已经由@Jotne和@bashophil提供
以下是一些其他的变化(只是为了好玩)
使用
sed
sed 's:.*/::' file
使用
grep
grep -oP '(.*/)?\K.*' file
使用
cut
-由@Thor添加
使用
basename
——由@fedorqui和@EdMorton建议
而IFS=read-r行;做
basename“$line”
完成<文件
将给出以下输出:
abc1.txt
abc2.txt
abc3.txt
用于:
可以缩短一些
awk-F/'{print$NF}'
@Jotne:或awk-F/'$0=$NF'
@Thor非常漂亮的indeedThanks!$NF代表什么?@Thor Thisawk-F/'$0=$NF'
将对值0
失败,因此它必须是awk-F/'{$0=$NF}1'
(请参阅我的更新帖子)@fedorqui谢谢你的建议!添加到解决方案中。注意,在我建议的版本中,如果文件路径有空格,它不会失败,因为在调用basename
时引用变量可以避免它。@fedorqui这很酷。实际上,我之前也尝试过同样的方法,但可能没有引用,所以决定使用xargs
,因为生成的结果是相同的。现在我已经消除了这种坏习惯。这很有趣。谢谢:)如果文件名包含反斜杠或以空格开头,循环将失败。当IFS=read-r行时,始终使用us,除非您有非常具体的理由不这样做。显然,如果文件名包含换行符,这种方法根本不起作用,但这是另一种蠕虫。如果文件包含/usr/bin/
,您希望发生什么?
rev file | cut -d/ -f1 | rev
while IFS= read -r line; do
basename "$line"
done < file
awk -F "/" '{print $NF}' input.txt
abc1.txt
abc2.txt
abc3.txt
$>cat input.txt
text path/to/file/abc1.txt
path/to/file/abc2.txt
path/to/file/abc3.txt