【问题标题】:Loop through text file and execute If Then statement for each line with bash循环遍历文本文件并使用 bash 为每一行执行 If Then 语句
【发布时间】:2014-11-03 06:24:45
【问题描述】:

我有一个命令列出了我们正在备份的所有文件夹的完整 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

【问题讨论】:

  • BashFAQ #1 很重要:mywiki.wooledge.org/BashFAQ/001
  • 顺便说一句,grep | awk 几乎总是愚蠢的; awk 可以做任何事情 grep 可以,无需将它们连接在一起。 awk '/Path:/ {print $2}',在直接情况下。
  • 在不同的点上——如果您希望能够在 bash 中以高性能的方式 (O(1)) 测试集合成员资格,您可能需要查看关联数组。

标签: bash loops nested


【解决方案1】:

使用 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 对其进行了测试,因此您的里程可能会有所不同。

【讨论】:

  • 尽管我使用 grep,但我不能说我想到了这一点。 grep -f 然后 -v 到正在备份的目标向我显示未备份的所有内容。这要简单得多,并且还输出缺少的添加内容的完整路径。非常感谢您的洞察力。
【解决方案2】:

这应该遍历 Tempfile1.txt 并 grep 查找 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多