2012-10-23 52 views
3

ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '如何減少管道的一個在下面的awk語句

我想要顯示它匹配以下條件的文件名: 1)不應該包含「DLY」關鍵字。 2)應該包含「000001.txt.gz」關鍵字。

我用上面的命令。是否可以合併我使用的兩個管道?

+1

旁註增加的變化。你的意思是'.'還是'\ .'? –

+0

良好的通話。 $ 5表示它是'\ .' – doubleDown

回答

1
ls -lrt | awk ' !/dly/ && $NF~/000001.txt.gz/ { print $NF }' 
2

可以在awk大多好像他們是C表達式組合條件,所以

ls -lrt | awk '/000001\.txt\.gz/ && !/dly/ { print $NF }' 

應該工作。 (在所有未測試)但是,如果你想對不尋常的事情的效率和穩健性(如您的文件名空格),那麼你應該這樣做,而不是這樣:

ls -1rt | awk '/000001\.txt\.gz/ && !/dly/ { print }' 

這將是可靠的,只要您的文件名中沒有換行符。 (該字節值— 字符;內核是無知的字符編碼—的不能出現在路徑組件是值爲0x2F和0x00時,但你一般不必擔心,除非你正在編寫有腳本來處理惡意文件名),另一種方法是,以達到更強大的語言,可以做opendir

perl -le 'opendir(my $dh, ".") or die; 
      print for sort grep { /00001\.txt\.gz/ && !/dly/ } readdir $dh' 

或更簡潔(但效率較低)

perl -le 'print for sort grep { /00001\.txt\.gz/ && !/dly/ } glob("*")' 

雖然這並不排序ls -rt的方式。我不記得你在Perl中如何做到這一點。

+1

我猜如果文件名有空格,它可能會失敗。或者如果文件名是'000001ptxt1gz'。或者,如果文件的所有者名稱中含有「dly」。也許'ls | awk'/000001\.txt\.gz/ &&!!/ dly/{print $ 0}''更準確。 – Birei

+0

那麼,*真的*做到這一點的方式是根本不使用'ls'(參見編輯)。雖然,點和空間的好點。 – zwol

+0

我喜歡'perl'。現在它值得** + 1 ** – Birei

4

這不使用awk,但它確實減少了管道的數量。

find -name "*dly*" -o -name "*000001.txt.gz*" -exec basename {} \; 

編輯:由Zack建議(爲GNU find

find -maxdepth 1 -name "*dly*" -o -name "*000001.txt.gz*" -printf '%f\n' 
+0

如果我正確閱讀OP,我認爲這應該是'find \! -name「* dly *」....' – twalberg

+0

@twalberg:'find'命令我寫了作品,試試了 – doubleDown

+0

啊,是的,我的壞 - 我偶爾忘記'find'不符合「expected 「關聯性和優先級規則。 – twalberg