我正在嘗試學習 Bash 腳本,并做一些練習。
現在正在嘗試創建搜索名稱并從檔案中獲取記錄的腳本。檔案內容是這樣的:Name:Phone:Email
示例:John Doe:123456789:[email protected]
但是我創建了一個函式
names=$(awk '{print $1}' $HOME/name_list.txt)
name_list()
{
for i in $names; do
if [ "$i" == "$name" ];then #name is user input from scriptfile.
echo $names | grep -o $i | wc -l | tr "\n" " ";echo "person found"
else
echo "Couldn't find anyone with given name"
fi
done
}
我感到困擾的是,我的if狀況會為檔案中的每個“i”生成“找到的人”輸出。同樣,else條件為每個不匹配的“i”生成輸出。我可以理解為什么它會這樣作業,但我找不到其他方法。我希望我的腳本掃描所有檔案,并且只為總匹配生成 1 個輸出,如果沒有匹配則只生成 1 個輸出。
uj5u.com熱心網友回復:
如果您仍然使用 Awk,那么在 Awk 中實作所有邏輯是有意義的。
awk -v name="$1" -F : '$1 == name { found }
END { if (found) printf "Found %i instances of %s\n", found, name
else printf "Not found: %s\n", name }' "$HOME/name_list.txt"
uj5u.com熱心網友回復:
假設這name_list.txt是廣告(只是名稱串列),那么您應該能夠grep從具有...的檔案中讀取搜索字串
echo $names | grep --file=$HOME/name_list.txt # ...
我應該提到,grep它還提供了-cor --count,它計算了匹配項。使用現代風格的grep,您還想知道-wor --word-regexp,如果它們不代表源中的完整單詞(或一組單詞),它將拒絕匹配目標模式,因此“約翰”不會匹配“約翰遜”。
這將需要重新組織您的腳本,因為grep完成了大部分作業,并且可能會違反您實際想要做的練習的條款,當然。在這種情況下,您可能希望將逐行結果寫入臨時檔案,然后將它們添加到輸出中。
uj5u.com熱心網友回復:
假設您只想顯示“未找到”訊息一次.....您可以嘗試這樣的事情:
names=$(awk -F'[:]' '{print $1}' name_list.txt)
IFS=$'\n'
name=$1
found=0
name_list(){
for i in $names; do
if [ "$i" == "$name" ];then #name is user input from scriptfile.
echo "person found at line $(grep -n $name name_list.txt | cut -d: -f1)"
found=1
break
fi
done
if [ $found == 0 ]
then
echo "Couldn't find anyone with given name"
fi
}
我只在 AWS 行 IFS=$'\n'中添加了-F'[:] ' 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447741.html
