在 For 循环中使用 Grep

bla*_*nJa 3 scripting bash shell-script

/home/errorcodes 包含:

421 RP-001
421 RP-002
421 RP-003
550 SC-001
550 SC-002
550 SC-003
550 SC-004
550 DY-001
550 DY-002
550 DY-001
550 OU-001
550 OU-002
Run Code Online (Sandbox Code Playgroud)

脚本:

#!/bin/bash

Elogs=/home/elogs.txt
Errors=/home/errorcodes
for i in `cat $Errors`; do
    #Get Error Logs
    grep "$i" /home/eximlog >> $Elogs
done
Run Code Online (Sandbox Code Playgroud)

调试:

+ cat /home/errorcodes
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-003 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-003 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-004 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep OU-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep OU-002 /home/eximlog
Run Code Online (Sandbox Code Playgroud)

为什么循环会分别读取“421”和“RP-001”等所有代码?并带来重复的结果。Grep 应该将代码视为单个字符串,例如:"421 RP-001" 调试应该是这样的:

+ for i in 'cat $Errors'
+ grep 421 RP-001 /home/eximlog
    ?
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 6

外壳将进行分词$(cat $Errors)。这就是为什么你一次得到一个词而不是一次得到一行。

你想要一个while read...循环:

while read -r line; do
    #Get Error Logs
    grep "$line" /home/eximlog >> $Elogs
done <"$Errors"
Run Code Online (Sandbox Code Playgroud)

read 面向行:一次读取一行。

或者,这可能对你有用,它根本不需要任何循环:

 grep -f "$Errors" /home/eximlog
Run Code Online (Sandbox Code Playgroud)

-f选项告诉grep给从文件中读取模式,每行一个模式。

此外,在我看来,您的错误代码模式是固定字符串而不是正则表达式。在这种情况下,为了避免令人不快的意外,请将-F选项添加到grep

 grep -Ff "$Errors" /home/eximlog
Run Code Online (Sandbox Code Playgroud)

  • 是的`grep -f "$Errors" /home/eximlog` 对我有用。谢谢@约翰1024 (2认同)