我正在嘗試從第 n 行開始在檔案中搜索關鍵字。如果找到,則將變數設定為 true 例如 testtext.txt 的檔案內容:
abc-0
def-0
xyz-0
abc-1
xxx-1
我想從第 3 行開始搜索關鍵字“def”,如果找到,則列印 true。還假設第 n 行是傳入值。
我在下面有一個粗略的想法,但不知道如何解決它。
#!/bin/bash
keyword=def
nthline=3
flag=false
count=$(awk 'NR>$nthline' ./testtext.txt | grep '$keyword' | wc -l)
if [[ $count -gt 0 ]];then
flag=true
fi
echo $flag
預期的輸出應該是錯誤的,因為 def 不存在于第 3 行以后。
問題是我無法將“nthline”變數傳遞到 awk 的 NR> 中,也無法將 $keyword 傳遞給該行的 grep
我已經使用實際值而不是傳入進行了測驗,它可以正常作業,因此命令應該可以正常作業。
count=$(awk 'NR>3' ./testtext.txt | grep 'def' | wc -l)
有沒有辦法做到這一點,或任何其他更好的解決方案?
EDIT: Got a solution that is almost 90% there, but I need to assign the variable after the flag is true. this is what I have so far, I am not sure if there is any better way of doing it.
#!/bin/bash
flagz=false
tgt="def"
n=$1
flagz=$(awk -v tgt="$tgt" -v n="$n" flag="$flagz"'
FNR>=n && index($0,tgt){
print("true1")
exit
}
' ./testtext.txt)
echo "$flagz"
uj5u.com熱心網友回復:
最好完全這樣做,awk因為您已經在使用 awk 對檔案進行切片。
例子:
tgt="def"
n=3
awk -v tgt="$tgt" -v n="$n" '
BEGIN{flag="false"}
FNR>=n && index($0,tgt){
flag="true"
exit
}
END{print flag}' file
或者,您可以制作一個管道,然后檢查$?是否grep找到您的匹配項:
tgt="def"
n=2
tail -n " $n" file | grep "$tgt" >/dev/null
現在$?將是0grep 是否找到該模式以及1是否未找到。然后你可以像這樣設定一個標志:
flag="false"
tail -n " $n" file | grep "$tgt" >/dev/null
[ $? ] && flag="true"
現在flag根據 grep 設定 true / false。該命令tail -n [some number] file將從絕對行號開始列印檔案內容。
對于大檔案,awk 效率更高,因為它在第一次匹配時退出。
根據更新進行編輯。
問題是將 Bash 標志設定為true或false基于行程。
$? 特殊引數是根據最近執行的前臺管道的退出狀態設定的。因此,選擇您的方法來對檔案進行切片并檢測字串,然后在$?管道之后立即在腳本中設定標志。請注意,測驗 $?會在測驗之前重置$?——因此您要么需要$?在測驗之前捕獲值,要么在管道本身中使用它。
這些方法有效:
1)捕獲$?并測驗:
awk -v tgt="$tgt" -v n="$n" -v flag=1 '
FNR>=n && index($0,tgt){
flag=0
exit
}
END{ exit flag }
' ./testtext.txt
res=$?
[ $res -eq 1 ] && flagz=false || flagz=true
2)捕獲字串結果并測驗:
res=$(awk -v tgt="$tgt" -v n="$n" -v flag="false" '
FNR>=n && index($0,tgt) {
flag="true"
exit
}
END{ print flag }' ./testtext.txt)
[ $res = "false" ] && flagz=false || flagz=true
3)使用管道并在管道中測驗:
tail -n " $n" file | grep "$tgt" >/dev/null && flagz=true || flagz=false
我的偏好是3用于小檔案,2用于大檔案。
uj5u.com熱心網友回復:
嘗試:
tail -n " $nthline" testtext.txt | grep -qF -- "$keyword" && flag=true || flag=false
uj5u.com熱心網友回復:
另一種方法是使用sed一個范圍運算式來告訴sed從第 3 行搜索到 end 3,$。接受的運算式型別addr1,addr2是有限的,但確實包括 的傳統替代形式sed 's/find/replace/。您可以在其中搜索包含的整行def,然后將其替換為&(整個匹配運算式的簡寫)。
要控制列印,請通過-n選項(抑制模式空間的正常列印)并p在替換運算式的末尾添加(列印),例如
sed -n '3,$ s/^.*def.*$/&/p' file
上面跳過了前兩行并在第 3 行開始搜索/替換。
uj5u.com熱心網友回復:
建議:
awk 'NR > 3 && /def/{print 1}' testtext.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/445113.html
上一篇:為什么我會收到IOException:“無法運行程式./shellScript.sh錯誤=2,Java中沒有這樣的檔案或目錄?
下一篇:jq帶單引號bash腳本
