簡體   English   中英

Bash:如何在讀取文件時讀取上一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM