bash:如果不在第二个文件中,则仅处理行

时间:2013-01-16 09:15:14

标签: bash sed awk grep

我有这段代码:

 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声明或什么?

3 个答案:

答案 0 :(得分:3)

您可以单独使用grep执行此操作:

$ cat file
blue
green
red
yellow
pink

$ cat exclude 
green
pink

$ grep -vx -f exclude file
blue
red
yellow

-v标记告诉grep仅输出file中未在exclude中找到的行,-x标记强制整行匹配。

答案 1 :(得分: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,则grep返回true,该文件由!如果找不到该行,则返回true   -x表示行匹配,因此行上没有其他内容   -F表示固定字符串,因此如果任何元字符以$行结尾,则它们将按字面匹配。

希望这有帮助

答案 2 :(得分: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

这将排除列表信息读取为数组(作为数组键) - 当awk从参数中读取第一个文件时,NR==FNR条件为真。然后,在读取包含文件时,如果当前行包含非空格字符并且在排除数组中不存在,则打印它。

等同于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