ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '
如何減少管道的一個在下面的awk語句
我想要顯示它匹配以下條件的文件名: 1)不應該包含「DLY」關鍵字。 2)應該包含「000001.txt.gz」關鍵字。
我用上面的命令。是否可以合併我使用的兩個管道?
ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '
如何減少管道的一個在下面的awk語句
我想要顯示它匹配以下條件的文件名: 1)不應該包含「DLY」關鍵字。 2)應該包含「000001.txt.gz」關鍵字。
我用上面的命令。是否可以合併我使用的兩個管道?
ls -lrt | awk ' !/dly/ && $NF~/000001.txt.gz/ { print $NF }'
可以在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中如何做到這一點。
這不使用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'
如果我正確閱讀OP,我認爲這應該是'find \! -name「* dly *」....' – twalberg
@twalberg:'find'命令我寫了作品,試試了 – doubleDown
啊,是的,我的壞 - 我偶爾忘記'find'不符合「expected 「關聯性和優先級規則。 – twalberg
旁註增加的變化。你的意思是'.'還是'\ .'? –
良好的通話。 $ 5表示它是'\ .' – doubleDown