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/ -> .*//'