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”
    创建一个
    awk
    变量,其值为shell变量
    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这将如何进行排序?