如何使用 grep 提取行尾的文件名?

如何使用 grep 提取行尾的文件名?

ls *.CCD我有一个日志文件,其中包含使用目录输出等信息 /var/tmp/Person

-rwxr-xr-x    1 bv90       dkas     153698  Nov 18 13:08 WE994002.CCD

我有很多这样的台词。

如果我这样做grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18",我将恢复整条线路,但我只需要WE994002.CCD.如何更改命令以仅打印文件名?

答案1

打印最后一列:

awk '{print $NF}' /var/tmp/k.log

或者

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18" | awk '{print $NF}'

答案2

添加 awk 语句来解析列表,如下所示:

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"| awk '{print $9}'

此 awk 语句空间分隔输出并打印第九个字段。

在这种情况下,您可以完全跳过 grep,并且可以将其缩短为

awk '/.CCD$/ && /bv90/ && /Nov 18/ {print $9}' /var/tmp/k.log

答案3

如果使用 GNU grep,则该-o选项可能相关:

$ echo '-rwxr-xr-x 1 bv90 dkas 153698 Nov 18 13:08 WE994002.CCD' | grep -o '[^ ]*\.CCD$'
WE994002.CCD

这假设您要过滤的文件名不包含空格;调用要求仅打印与以行末尾结尾grep -o的非空格字符序列匹配的行部分。.CCD整个命令将变为:

</var/tmp/k.log grep bv90 | grep "Nov 18" | grep -o '[^ ]*\.CCD$'

答案4

如果文件名中没有空格,也没有软链接,我将使用 AWK,正如 Cyrus 所描述的那样。

如果文件名中可能有空格,我们可以使用空格来描述前面的所有字段,捕获后面的所有标记:

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/' logfile

第一组括号描述一列,后跟空格。如此重复8次。第二组括号捕获该行的其余部分,即后向引用 \2 捕获的部分。

如果您需要删除软链接,我很确定我们需要另一个 sed 命令,如 cas 所述:

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/ ; s/ -> .*//'

相关内容