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