如何使用GREP命令读取文件中的多行

时间:2017-04-05 02:33:22

标签: linux grep

我很难过。如何使用GREP命令读取文件中的多行。这是我迄今为止所做的工作,但只读取文件中的一行。如果我添加另一行说它无法读取....我正在使用Linux shell。在过去的两天里,我一直试图研究这个,但仍然没有。任何帮助都会受到欢迎。感谢。

(

echo;echo -ne "Checking Firewall INPUT chain for entry ... ";

if ! iptables -vnL INPUT | grep `cat $_file` >/dev/null ; then
    echo "Not Found!"

    for IP in `cat $_scriptpath/tmp/badip.cache`
   do

    iptables -A INPUT -s $IP -j badipblock

   done

    echo External IP : $IP has been banned! $_DATE > $_scriptpath/log/badip_fw_$_DATE.log
else
echo "Entry already exists"
fi
echo;

)

1 个答案:

答案 0 :(得分:2)

如何从grep

中的文件中读取要匹配的模式列表
grep -f "$_file"

...会将$_file的每一行视为一种模式,并匹配这些模式的任何。 (通常的标志可用于修改这些模式的解释方式 - ERE为-E,固定字符串为-F等。

为什么原始代码失败

直接原因是:

grep `cat $_file`

在这个看似无害的代码中,您实际上正在执行以下操作:

  • 将shell设置$_file中找到的字符的变量IFS的内容(默认为空格,制表符和换行符)拆分为多个单词
  • 将每个单词视为单独的glob表达式;如果任何可以被解析为glob,则将其替换为本地文件系统上每个匹配条目的一个单词。
  • 阶段产生的单词作为单独的参数传递给cat
  • cat尝试打开一个为每个单词命名的文件(除非它们以短划线开头,在这种情况下它会将它们视为选项标志)并将它们的输出连接在一起。
  • 捕获连续输出,再次对其进行字符串拆分(如上所述),再次对其进行全局扩展(如上所述),然后将生成的单词追加到grep的命令行

......那么,那又是什么呢?我们假设cat的输出只评估为一个单词foo

grep foo

...所以,我们在stdin流中寻找foo。相反,让我们说它评估为两个单词foobar

grep foo bar

这样做完全不同:它将foo视为要搜索的字符串 - 但它将bar视为要搜索的文件的名称,忽略您作为标准输入管道传输的任何内容。

有些参考资料可供参考: