当我使用以下代码时,我得到输出,如:
/home/pony/IOSO/test/A
/home/pony/IOSO/test/B
FILE=last.cfg
DIR=$(realpath "$2") #or something else
grep $DIR $FILE | awk '{ print $2 }' | sort | uniq # | basename does not work
如何使用basename或类似的东西来管道我的管道:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
答案 0 :(得分:1)
只需将uniq
命令的输出传递给sed命令(如下所示),即可删除最后/
个符号前的所有字符。
grep $DIR $FILE | awk '{ print $2 }' | sort | uniq | sed 's~.*/~~'
答案 1 :(得分:1)
您可以使用awk
执行此操作,这样就可以避免不必要地使用grep
awk
和sed
sequance
正确的方法可以是
awk -v dir="$DIR" -F"/" '$0 ~ dir{print $NF}'
<强>测试强>
$ DIR="/home/pony/IOSO/test"
$ cat input
/home/pony/IOSO/test/A
/home/pony/IOSO/test/B
/home/test/test
$ awk -v dir="$DIR" -F"/" '$0 ~ dir{print $NF}' input
A
B
它的作用
-v dir="$DIR"
创建一个awk
变量,其值为shell变量DIR
-F"/"
将字段分隔符设置为/
。这是在输入文件中完成的,目录由/
分隔,我们需要获取最后一个字段filename。
'$0 ~ dir
检查每个输入行是否与变量dir
中的模式匹配
print $NF
打印最后一个字段,这里是文件名。 NF
代表字段数。