我有这段代码:
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声明或什么?
答案 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