是否有可能只grep只有一列,并同时打印其他SELECTED输出

问题描述:

标题我不明确。这是我问的一个例子。是否有可能只grep只有一列,并同时打印其他SELECTED输出

#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',仍然打印文件大小,并没有输出包含前两行。

非常感谢你所以,阅读手册页并没有帮助我在这一个。

您可以使用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,大小和名字。

+0

圣牛。我试图使用awk,但不知道如何执行if语句。非常有用的信息。谢谢! – Rell3oT

+0

对于名称中有空格的文件,这不起作用。修复并不难。 – tripleee

+0

此外,substr只在文件名的开头查找匹配项,而不是名称中的任何位置。同样,这不难解决,但应该避免解析'ls'输出。 – tripleee

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

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。

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

也许增加'-maxdepth 0'来防止'find'进入子目录。 – tripleee

可以绕过ls,只是使用bash的文件名glob

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