循环遍历文本文件并使用bash为每行执行If Then语句

时间:2014-09-09 18:18:47

标签: bash loops nested

我有一个命令,列出了我们备份的所有文件夹的完整8级深度路径。 我还有一个命令,它枚举系统上的所有8级深层文件夹。 这两个都作为变量存储在bash脚本中。

我正在尝试获取一个循环,它接受文件1并将第一行条目用作if / then / else中的变量,然后继续向前移动到文件的末尾。

我已经尝试了很多东西,但超出了我的技能范围,提供了一个不会混淆这篇文章的读者的例子。

TempFile1=/ifs/data/scripts/ConfigMonitor/TempFile1.txt
TempFile2=/ifs/data/scripts/ConfigMonitor/TempFile2.txt
find /ifs/*/*/backup -maxdepth 4 -mindepth 4 -type d > $TempFile1
isi snapshot schedules list -v | grep Path: | awk '{print $2}' > $TempFile2

list line 1 on $TempFile1
Grep for line 1 within $TempFile2
if result yielded then
  echo found
else
  echo fullpath not being backed up
fi

2 个答案:

答案 0 :(得分:0)

这应该迭代Tempfile1.txt和grep for TempFile2.txt中的行。

while read line; do
    if grep $line /path/to/TempFile2.txt > /dev/null
    then
       echo "Found $line"
    else
       echo "Did not find $line"
    fi
done < Tempfile1.txt

Tempfile1.txt:

a
b
c

Tempfile2.txt

b
d
z

输出:

Did not find a
Found b
Did not find c

答案 1 :(得分:0)

使用Grep的-f标志

grep(1)说:

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

因此,以下内容应该有效:

grep -f patterns_to_match.txt file_to_examine.txt

更快报告

另一种思考方式是你可以让GNU grep向你展示所有的比赛:

echo 'Lines that match a pattern in your pattern file.'
grep -f patterns_to_match.txt file_to_examine.txt

然后显示所有与任何模式都不匹配的行:

echo 'Lines that do not match any patterns in your pattern file.'
grep -f patterns_to_match.txt -v file_to_examine.txt

这可能比在Bash中一次循环一行文件更快更有效。使用GNU grep以外的grep可能会得到或不会得到类似的结果;虽然-f和-v标志由POSIX指定,但我只针对GNU grep 2.16进行了测试,因此您的里程可能会有所不同。