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)
外壳将进行分词上$(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)