Shell-Script

如何在管道命令中使用條件語句?

  • January 29, 2019

正在處理的數據將遵循特定的模式。在這種情況下,我想隔離在第三列中找到的所有字元並返回在*“-”*之後找到的所有字元,但前提是該分隔符存在於列中。否則它不應該返回任何東西。

eval $A=$(echo $1 | awk -F"." '{print $3}' | cut -d\- -f2-)

第一條awk語句將字元串分成

111
222
333-ab3-On21-2

cut命令在第一個“-”之後列印字元。

字元串 1 111.2222.333-ab3-On21-2返回所需的結果:

ab3-On21-2

字元串 2 111.2222.334返回不需要的結果:

333

分隔符不存在於字元串的"-"最後一部分,在這種情況下如何更改此程式碼以返回 0 或“”?

我不確定您從哪裡獲得“條件”,因為您的語句中沒有任何條件。awk -F- {print}沒有做任何有用的事情;只是將輸入傳遞到輸出。

但是,您可以使用sed表達式做您想做的事情,以簡化整個管道:

sed -n 's/.*\.[^-]*-\(.*\)/\1/p'

和意味著它只會列印與表達式匹配的字元串-np

該表達式將剝離直到最後一個.,然後剝離第一個之前的所有內容-

所以:

% echo 111.2222.333-ab3-On21-2 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
ab3-On21-2
% echo 111.2222.333 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'           
% 

如果您的輸入更複雜(例如,可能有四個.分隔欄位),那麼模式可能需要更聰明一些。

sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'

例如

% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
ab3-On21-2

引用自:https://unix.stackexchange.com/questions/497307