2017-07-09 205 views
-1

我有以下bash腳本段,它使用grep來確定輸入行是否包含特定的模式。如何確定字符串是否包含帶awk的子字符串

echo $input_line | grep -q "$pattern" 
if [ $? -eq 0 ]; 
then 
    # Input line contains pattern 
    # Execute some bash commands 
else 
    # Input line DOES NOT contain pattern 
    # Execute other bash commands 
fi 

我需要用awk重寫而不使用grep。我嘗試了幾種變體,但它們都不起作用,例如,無論是否包含輸入線模式,以下兩種都始終打印MATCH, 。

echo $input_line | awk -v b="$pattern" '/pattern/ { print "MATCH" }' 

echo $input_line | awk -v b="$pattern" '/$0 ~ pattern/ { print "MATCH" }' 

更新:

拆卸/建議解決所描述的問題。現在我遇到了awk命令在if語句中返回結果的問題。我寫了下面的「醜陋」的片段:

pattern="abc" 
input_line="xyz123 678q we uqa abc asd" 
RES=$(echo $input_line | awk -v pat="$pattern" '$0 ~ pat { print "1" }') 
if [ $RES -eq 1 ]; 
then 
    echo Input line $input_line contains pattern $pattern 
else 
    echo Input line $input_line DOES NOT contains pattern $pattern 
fi 

input_line="tult uil7665 5444tu l098 7tu" 
RES=$(echo $input_line | awk -v pat="$pattern" '$0 ~ pat { print "1" }') 
if [ $RES -eq 1 ]; 
then 
    echo Input line $input_line contains pattern $pattern 
else 
    echo Input line $input_line DOES NOT contains pattern $pattern 
fi 

所以我有下面的輸出,因爲在第二種情況下,當輸入行不包含模式變量RES未設置:

Input line xyz123 678q we uqa abc asd contains pattern abc 
./test.sh: line 21: [: -eq: unary operator expected 
Input line tult uil7665 5444tu l098 7tu DOES NOT contains pattern abc 

任何想法如何改善這個「醜陋的」腳本與if語句片段?
感謝

+0

只需拿出最後一次嘗試的'/''$ 0〜pattern {print ...' –

+1

當您編輯該問題時,還請包含示例輸入和輸出以幫助顯示「不工作」意思是 –

回答

-1

用AWK與您需要做的模式匹配所引用的變量:

if [[ "$(input_line | awk '/'$pattern'/ { print "MATCH" }')" == "MATCH" ]] 
then 
     pattern matches 
else 
     No pattern matches 
fi 

我假設在這裏,正則表達式是由變量模式引用的動態變量。

請特別注意awk語句中單引號的位置。

+0

千萬不要這樣做,它在多種基本的shell和awk方式中是錯誤的。 –

+0

如果你在意解釋? –

+0

你正在做的一些你永遠不應該做的事情是不引用shell變量,並讓shell變量的值擴展成爲awk腳本文本的一部分。查看任何shell介紹文本和http://cfajohnson.com/shell/cus-faq-2.html#Q24或Google。您現在另外嘗試執行一個變量,因此會在PATH中選擇任何具有相同名稱的命令。您還正在使用awk來進行bash自己可以執行的正則表達式匹配,並且在您應該使用退出狀態時從awk生成文本作爲比較來進行測試。 OP代碼接近正確。 –

相關問題