[英]Bash: How to read previous line while reading a file
我正在編寫一個bash腳本,該腳本應通讀具有某些設備配置行的文件。 這個想法是從文件中讀取並打印一行。 如果在當前行中找到“ bel”,則檢查下一行是否具有關鍵字X,它是當前行的“ awk'{print $ 3}'”。 如果在當前行中未找到keywordA,請轉到下一行並繼續搜索“ bel”。
如果第二行包含關鍵字X,則打印成功,否則,打印失敗。 無需打印第二行本身。 但是,這是我無法弄清楚的部分,如果第二行沒有keywordB並且打印失敗,則重新搜索該行的keywordA並基本上再次使用該邏輯。
以下是我想出的內容:
#! /bin/bash
Input="/tmp/temp2"
while read LINE
do
if $(echo "$LINE" | grep -q bel)
then
echo "$LINE"
intf=`echo $LINE | awk '{print $1" "$2" "$3}'`
echo $intf
read LINE
if $(echo "$LINE" | grep -q "$intf " )
then
echo "Success"
else
echo "Fail"
fi
fi
done < "$Input" > /tmp/temp3
本質上,我只希望它重新閱讀第二行並搜索keywordA。 但是,由於代碼也在循環內執行讀取LINE的操作,因此在迭代時移至第三行。
idk:idk1-baf1:set接口ae0描述“ baf-> bel”
idk:idk1-baf1:set接口ae6描述“ baf-> bel”
idk:idk1-baf1:set接口ae6聚合醚選項最小鏈接4
idk:idk1-baf1:set接口ae12描述“ baf-> bel”
idk:idk1-baf4:set接口ae12聚合醚選項最小鏈接4
idk:idk1-baf4:set接口ae131聚合醚選項最小鏈接4
idk:idk1-baf4:set接口ae133聚合醚選項最小鏈接4
idk:idk1-baf1:set接口ae0描述“ baf-> bel”
失敗
idk:idk1-baf1:set接口ae12描述“ baf-> bel”
失敗
因此,當前輸出基本上跳過了這一行:
idk:idk1-baf1:set接口ae6描述“ baf-> bel”
idk:idk1-baf1:set接口ae0描述“ baf-> bel”
失敗
idk:idk1-baf1:set接口ae6描述“ baf-> bel”
成功
idk:idk1-baf1:set接口ae12描述“ baf-> bel”
失敗
我不在乎是否有人可以調整代碼,或提出完全不同的解決方案:)
你可以用awk
做
awk '{if(j==1){if(i==$1$2$3){print "success"}else{print "fail"}j=0} if($0 ~ /bel/){i=$1$2$3;j=1;print} }' file
它將打印:
idk:idk1-baf1:set interfaces ae0 description "baf -> bel"
fail
idk:idk1-baf1:set interfaces ae6 description "baf -> bel"
success
idk:idk1-baf1:set interfaces ae12 description "baf -> bel"
fail
說明
默認情況下,awk將空格作為輸入字段分隔符。
$ 0 :表示當前行/行。
$ 1 :表示當前行/行的第一列。
$ 2 :表示當前行/行的第二列。
.... 等等。
$ 0〜/ bel /:將在當前行/行中搜索“ bel”字符串。
i = $ 1 $ 2 $ 3 :如果行/行中存在“ bel”,則它將當前行的前3列的值存儲在變量i中。
j = 1 :將其視為標志。 如果行中出現“ bel”。 等於1。
print :如果存在“ bel”,則它將打印當前行/行。
現在來看另一個if語句。
if(j == 1) :檢查j(即此處的標志)是否等於1。如果等於1,則表示前一行將“ bel”作為字符串。
if(i == $ 1 $ 2 $ 3){print“ success”} else {print“ fail”} j = 0 :這里是將i(存儲在前一行的第1 3列)與當前行的第1 3列進行比較。 如果匹配,則將打印“成功”,否則將打印失敗並設置j = 0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.