2011-06-27 29 views
0

我發現這個命令來工作的偉大:awk中沒有采取bash的變量

awk -v "/mallory:/,/end-config/ {next} 1" /filename.txt 

它需要一切都在像這樣的文件:

alice: 
config option 1 
config option 2 
end-config 

mallory:   <--- Line gets deleted 
config option 1 <--- Line gets deleted 
config option 2 <--- Line gets deleted 
end-config  <--- Line gets deleted 

bob: 
config option 1 
config option 2 
end-config 

,只刪除了馬洛裏配置塊。

所以現在我想在bash腳本中定義它,所以用戶名可以是bash變量。我這樣做:

#!/bin/bash 
username="mallory" 
awk -v username="$username" "/username:/,/end-config/ {next} 1" /file.txt 

猜猜看是什麼。它不會刪除任何東西。輸出與我開始的文件相匹配。是什麼賦予了?我正確導入了我的變量,對吧?

回答

0
"/username:/,/end-config/ {next}" 

username將在那裏文字。要匹配的變量,你必須使用一個明確的模式匹配:

awk -v username="mallory" ' 
    $0 ~ (username ":"),/end-config/ {next} 
    1' 
1

或者,你可以使用

#!/bin/bash 
username="mallory" 
awk -v "/${username}:/,/end-config/ {next} 1" /file.txt 

記住殼會做殼插補程序獲取到AWK之前,所以${username}將被替換爲mallory。爲了更安全起見,你可能想要使用

#!/bin/bash 
username="mallory" 
awk -v '/'"${username}"':/,/end-config/ {next} 1' /file.txt 

這將確保awk程序受到保護而不受任何其他shell解釋的影響。

1

/foo/,/bar/是您的{next}聲明將起作用的地址範圍。而且,地址必須是文字。 Geekosaur的回答也有一些調整的工作:

awk -v username="mallory" ' 
    $0 ~ (username ":"),/end-config/ {next} 
    1' filename.txt 

需要的1awk做任何事情。一個更好的方法可能是:

awk -v username="mallory" ' 
    $0 ~ (username ":"),/end-config/ {next} 
    {print $0}' filename.txt 

其中指出您的打印線{print $0},如果你不通過{next}聲明跳過它。如果沒有給出其他命令,Awk將打印該行,並返回一個true(非零)值。

+0

我們可以使用{print}來減少混亂,而不是使用{print $ 0}。它比隱含的印刷更孤立的真實模式(1)更明確 –

0

sed稍短 - 將以下內容保存到文件中,例如: confdel.sh

sed "/^$1:/,/end-config/d" 

,並用它喜歡:

bash confdel.sh mallory < config_file.txt 
0

/username:/恰好匹配字符串你已經寫了,沒有什麼與環境變量的事,但AWK可以讀取環境變量。我會建議:

username=mallory 
awk '$0 == ENVIRON["username] ":",/end-config/ {next} 1' /file.txt 

其實這不是最好的解決方案,因爲在結果中有雙重空行。所以,如果username=mallory設置,那麼結果是:

alice: 
config option 1 
config option 2 
end-config 


bob: 
config option 1 
config option 2 
end-config 

但也許是對你合適。