2014-02-25 275 views
8

我使用bash腳本測試purpose.During我的測試中,我必須找到一個文件中的字符串的第一次出現的行號。我已經嘗試過「awk」和「grep」兩種,但它們中沒有一個返回值。用grep獲得在bash shell中字符串的第一次出現的行號

在awk例如

#/!bin/bash 
.... 
VAR=searchstring 
... 
cpLines=$(awk '/$VAR/{print NR}' $MYDIR/Configuration.xml 

此不展開$ VAR。如果我使用VAR它的作品的價值,但我想用VAR

grep的例子

#/!bin/bash 
... 
VAR=searchstring  
... 
cpLines=grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: 

這給了錯誤線20:-n:命令未找到

回答

5

試着這麼做:

awk -v search="$var" '$0~search{print NR; exit}' inputFile 

awk/ /將字面解釋awk變量。您需要使用match~)運算符。我們在這裏做的是根據您的輸入行尋找變量。如果匹配,我們打印存儲在NR中的行號並退出。

-v允許您在上面的示例中創建一個awk變量(search)。然後將其分配給您的bash變量($var)。

+1

我喜歡這一個最好的,因爲它僅使用一個單一的過程。 –

8

您在grep的需要$()爲變量替換

cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d:) 
6
grep -n -m 1 SEARCH_TERM FILE_PATH |sed 's/\([0-9]*\).*/\1/' 

grep的切換

-n =包括行號

-m 1 =匹配一個

sed選項(流編輯器) :

's/X/Y/' - ,其中Y

\([0-9]*\)替換X - 正則表達式匹配位數發生零次或多次,轉義的括號,括號中與正則表達式匹配的字符串將是Y(更換\ 1參數字符串)

\([0-9]*\).* - .*將匹配發生的零次或多次的任何字符。

+0

工作。謝謝。 – Ryan

相關問題