Linux 使用管道时类似于Basename的字符串操纵 您好,提前感谢您的回答。
当我使用以下代码时,我得到如下输出:Linux 使用管道时类似于Basename的字符串操纵 您好,提前感谢您的回答。,linux,string,bash,echo,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=/th
/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
只需将
uniq
命令的输出传递给下面这样的sed命令,即可删除最后一个/
符号之前的所有字符
grep $DIR $FILE | awk '{ print $2 }' | sort | uniq | sed 's~.*/~~'
您可以使用
awk
执行此操作,以避免不必要地使用grep
awk
和sed
序列
正确的方法可以是
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”
变量,其值为shell变量awk
dir
将字段分隔符设置为-F”/“
。这就像在输入文件中一样,目录由/
分隔,我们需要得到最后一个字段,filename/
检查每个输入行是否与变量“$0~dir
dir
打印最后一个字段,这里是文件名print$NF
表示字段数NF
grep$DIR$FILE | awk'{print$2}'| sort | uniq | sed的.*/~'
就是这样!谢谢我不知道如何选择您作为正确答案,因为我刚刚加入。您的解决方案可能会快得多,但我希望避免使用我尚未完全理解的代码序列。您肯定让我在本周末浏览了awk手册。@user3473750我为您添加了一个小说明。希望它现在对您有所帮助:)@user3473750它是输入文件名,在参数的最后指向awk
。将答案中的输入
替换为$FILE
。像awk-v dir=“$dir”-F”/“$0~dir{print$NF}”$FILE
好吧,非常感谢你教我一些新东西。但是,由于第一个答案更接近我们在学校里所学的内容,我会选择那个答案,如果只是为了避免在谈论我的“项目”时出现不必要的问题。我讨厌他们现在把任何愚蠢的家庭作业称为项目,但这是离题的。@user3473750这将如何进行排序?