使用管道时的字符串操作等基本名称

时间:2015-04-15 05:02:02

标签: linux string bash echo

您好,并提前感谢您的答案。

当我使用以下代码时,我得到输出,如:

  /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

2 个答案:

答案 0 :(得分:1)

只需将uniq命令的输出传递给sed命令(如下所示),即可删除最后/个符号前的所有字符。

grep $DIR $FILE | awk '{ print $2 }' | sort | uniq | sed 's~.*/~~'

答案 1 :(得分:1)

您可以使用awk执行此操作,这样就可以避免不必要地使用grep awksed 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代表字段数。