2013-01-10 35 views
2

的空白sed輸出可能對於知道某個人的簡單問題,但我很難從文件中檢索某些變量值。我的文件是這樣的:替換後使用-n

variable1 12 
variable2 43 
variable3 897 

,我希望得到變量2的值,43

我試着用SED,但沒有運氣的一些命令:

sed -n 's/variable2 //;s/variable3//' myFile 

回答

3

隨着只有sed

$ sed -n 's/^variable2 //p' file 
43 

你的問題是您正在使用-n打壓sed輸出,所以你需要p標誌,以便sed版畫是其中取代發生的線。

由於這只是模式匹配我會 grep的去這樣的:

$ cat file 
variable1 12 
variable2 43 
variable3 897 

$ grep -Po '(?<=^variable2)\d+' file 
43 

甚至只是awk

$ awk '$1=="variable2"/{print $2}' file 
43 
+0

雖然我喜歡'grep -Po',但我很少推薦它,因爲它不夠便攜。不過,你的'sed'解決方案** + 1 **。 – ghoti

+0

@ghoti我想說的是,Linux和OSX中的絕大多數都帶有'GNU sed',哪裏不是出於好奇? –

+0

GNU/Linux系統通常帶有GNU sed,但OSX,FreeBSD,Solaris,HP/UX等都有自己的。那麼,OSX的sed是從FreeBSD衍生出來的,Solaris在版本11之前都帶有一個SysV和一個BSD sed。但是你的sed解決方案很好,而且便於攜帶。這是grep的'-P'選項,不是在FreeBSD中,或者是除了OSX之外的其他任何版本,它在10.6版本中開始支持它。它當然不是普遍的。 – ghoti

2

使用grep到找到該行,然後使用cut來提取該值:

$ grep ^variable2 myFile | cut -d ' ' -f 2 

測試:

$ cat myFile 
variable1 12 
variable2 43 
variable3 897 
$ grep ^variable2 myFile | cut -d ' ' -f 2 
43 
$ 
+0

完美的感謝一個版本! – Sulli

1

對於格式化像這樣的文件,grep的| awk將工作:

grep variable2 file | awk '{print $2}'

就可以了,不要指望用於格式化甚至略有不同的文件。

+0

你說得對 - 我做了...並修復了它。 – John

+1

這是多餘的,沒有必要從grep到awk。參見[pepoluan的答案](http://stackoverflow.com/a/14261023/1072112)。 – ghoti

+0

或者看我的。無論是使用'grep'還是'awk',都是1個進程。 –

3

必須在使用sed

我更喜歡使用awk對這種東西:

awk -v varname="variable2" '$1==varname {print $2}' myFile 

這隻要沒有變量(在左邊的列)工作包含空格。

編輯:

由於標題是「從文件中獲取變量值在bash」,這裏不涉及外部程序

wantvar="variable2" 
datafile="myFile" 
while read varname varval; do 
    # Case-insensitive matching. If you need case-sensitivity, remove the pair of commas 
    # on both sides. 
    if [[ ${varname,,} = ${wantvar,,} ]]; then 
    echo $varval 
    break 
    fi 
done < $datafile 
+0

如果你做內聯賦值,可能是'awk'$ 1 ==「variable2」{print $ 2}'file',並且在這種情況下說bash遠離bash,那麼傳遞'varname'沒有任何好處。 –

+0

@sudo_O true。以防萬一問題製作者想要在某個腳本中嵌入該行。至於你的第二個陳述,這個問題的**標題**是「... with bash」。我寫了腳本來防止問題製作者做一些完全不必要的事情,比如'some_variable =「$(awk ....)」' – pepoluan

+0

不要掛上標題,我已經改變它來反映問題, OP只是錯過了'p'標誌到'sed'。真的bash不適合這種事情! –