是否可以仅grep一列并同时打印其他SELECTED输出

时间:2011-10-11 06:41:45

标签: linux bash

标题我的含糊不清。这是我要问的一个例子。

#ls -l

打印出类似这样的内容

-rw-r--r-- 1 root root   5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root   5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root   5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root   5122 2011-10-08 19:38 5111.txt

假设我想使用grep查找包含'511'的所有文件名,并打印出文件的大小/文件名。

如何grep文件名'511',仍然打印文件大小,而不是输出包含前两行。

非常感谢你,阅读手册并没有帮助我。

4 个答案:

答案 0 :(得分:3)

您可以使用awk

pax:~$ echo '
-rw-r--r-- 1 root root   5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root   5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root   5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root   5122 2011-10-08 19:38 5111.txt
' | awk '{if (substr($8,1,3)=="511"){print $5" "$8}}'

5121 5110.txt
5122 5111.txt

它只是检查字段8(文件名)以查看它是否以“511”开头,如果是,则打印出字段5和8,大小和名称。

答案 1 :(得分:2)

find . -name '*511*' -printf "%s\t%p\n"

答案 2 :(得分:1)

如果它只是您要过滤的文件名,为什么首先列出其他文件?

ls -l *511* | cut -c23-30,48-

或甚至与awk;

ls -l *511* | awk '{ $1 = $2 = $3 = $4 = $6 = $7 = ""; print }'

但是,ls的输出并不完全可靠,因此您应该避免直接处理它。

perl -le 'for (@ARGV) { print ((stat($_))[7], " $_") }' *511*

stat()系统调用以机器可读格式返回ls显示的原始信息。任何可以访问此信息的工具都可以;它不一定是Perl。

答案 3 :(得分:0)

您可以绕过ls并使用bash的文件名glob

for f in 511*
do
    echo $f $(stat --format '%s' $f)
done