2011-10-11 23 views
2

標題我不明確。這是我問的一個例子。是否有可能只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',仍然打印文件大小,並沒有輸出包含前兩行。

非常感謝你所以,閱讀手冊頁並沒有幫助我在這一個。

回答

4

您可以使用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

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。

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

也許增加'-maxdepth 0'來防止'find'進入子目錄。 – tripleee

0

可以繞過ls,只是使用bash的文件名glob

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