我正在從 shell 腳本中查找文本檔案中的匹配項并獲得所需的輸出
文本檔案的格式是這樣的:
var1 = X
var2 = X
var3 = X
var4 = BDH
我的shell腳本現在是這樣的
values=$(grep -hnr -A2 "$another_value_to_match" exemple.txt | cut -d "=" -f2)
find_all_values=$(ls -d $DIR/["$values"]* | xargs -n 1 basename)
another_value_to_match是我從另一個函式中獲取的變數,應該包含 (var1, var2, var3, var4)。 find_all_values正在嘗試在一個大檔案夾中查找以(X、B、D 或 H)開頭的子檔案夾。
我的問題是,如果another_value_to_match == var4 一切都很好并且可以正常作業,因為它是文本檔案中的最后一行,但是如果another_value_to_match == var1 或任何其他值作為輸出:XXX BDH。
我的問題是:無論是在文本檔案的第一行還是最后一行,找到匹配項后如何停止?簡化事情,如果
if (another_value_to_match == var2)
values=$(grep -hnr -A2 "$another_value_to_match" exemple.txt | cut -d "=" -f2 | add_something_to_pipe)
echo $values
values == X
uj5u.com熱心網友回復:
這個怎么樣:
another_value_to_match="var1"
sed -n "/$another_value_to_match *=/{s:^.*=::;p;q}" example.txt
解釋:
sed -n-sed使用選項運行-n(不是自動列印)/$another_value_to_match *=/- 找到包含該文本的行s:^.*=::- 洗掉所有內容=(包括)p;q- 列印,然后退出sed
如果您需要獲取最后一個值,請運行tac以反轉:
tac example.txt | sed -n "/$another_value_to_match *=/{s:^.*=::;p;q}"
(對不起我的英語不好)
uj5u.com熱心網友回復:
你沒有得到你的想法。該指令
cut -d "=" -f2
為您提供“=”之后的所有內容作為引數,包括前導空格字符。你應該使用
awk -v testor="$another_value_to_match" '{ if( $1 == testor ){ print $3 } }'
或者
awk -v testor="$another_value_to_match" '{ if( $1 == testor ){ print $NF } }'
假設該值是單個字串,則僅獲得所需的字串/值的干凈回傳。
如果值是多字串,事情會變得更加復雜,但我認為這會讓你思考程序朝著正確的方向作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520123.html
標籤:重击壳
上一篇:在bash中使用jq創建帶有json-objects陣列的json檔案
下一篇:在VB.NET中保存記錄
