0

私はこのコードブロックを持っています:

 while IFS=$'\n' read -r line || [[ -n "$line" ]]; do
    if [ "$line" != "" ]; then
        echo -e "$lanIP\t$line" >> /tmp/ipList;
    fi
done < "/tmp/includeList"

私はこれが本当に単純でなければならないことを知っています。しかし、別のリスト (/tmp/excludeList) があります。行がexcludeListに見つからない場合にのみ、whileループ内で行をエコーし​​たい。それ、どうやったら出来るの。awkステートメントか何かがありますか?

4

3 に答える 3

3

grep単独でこれを行うことができます:

$ cat file
blue
green
red
yellow
pink

$ cat exclude 
green
pink

$ grep -vx -f exclude file
blue
red
yellow

-vフラグは、で見つからないgrep行のみを出力するように指示し、フラグは行全体の一致を強制します。fileexclude-x

于 2013-01-16T09:40:25.740 に答える
0

grep を使用する

while IFS=$'\n' read -r line || [[ -n "$line" ]]; do
    if [[ -n ${line} ]] \
        && ! grep -xF "$line" excludefile &>/dev/null; then
       echo -e "$lanIP\t$line" >> /tmp/ipList;
    fi
done < "/tmp/includeList"

-n $line は、 $line が空でない場合、! によって反転される除外ファイルで $line が見つかった場合、grep が true を返すことを意味します。その行が見つからない場合は true を返します。
-x は行が一致したことを意味するため、行には他に何も表示されません

お役に立てれば

于 2013-01-16T09:23:14.853 に答える
0

awk を使用:

awk -v ip=$lanIP -v OFS="\t" '
    NR==FNR {exclude[$0]=1; next}
    /[^[:space:]]/ && !($0 in exclude) {print ip, $0}
' /tmp/excludeList /tmp/includeList > /tmpipList

これは、除外リスト情報を配列 (配列キーとして)NR==FNRで読み取ります。awk が引数から最初のファイルを読み取っている間、条件は true です。次に、インクルード ファイルの読み取り中に、現在の行にスペース以外の文字が含まれていて、それが除外配列に存在しない場合は、それを出力します。

grep と同等:

grep -vxF -f /tmp/excludeList /tmp/includeList | while IFS= read -r line; do
    [[ -n "$line" ]] && printf "%s\t%s\n" "$ipList" "$line"
done > /tmp/ipList
于 2013-01-16T12:18:07.070 に答える