我需要读取一个日志文件,并检查该文件中是否有某个字符串。
我实际上正在尝试在bash上运行以下命令,它似乎可以工作:
Unable to import module 'handler': Error
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/var/task/handler.js:2:15)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
位置:
cat $f | grep -m1 'Input file for table '"$current_table"' NOT FOUND'
=日志文件; $f
=要在我正在寻找的字符串内串联的变量。关键是我必须将此代码放在$current_table
脚本中,如下所示:
.sh
它不起作用。
然后我尝试在bash中运行以下代码,并且再次使用,语法完全相同。
if [ "$(cat $f | grep -m1 'Input file for table '"$current_table"' NOT FOUND')" != "" ]; then
有人可以解释我错了吗?有什么建议吗?
答案 0 :(得分:3)
尝试一下:
# redirected to /dev/null to avoid output
if grep -m1 "Input file for table $current_table NOT FOUND" "$f" >/dev/null
then
echo 'found'
else
echo 'not found'
fi
您不需要cat
即可使用grep
(以及tail
和sed
等过滤程序)。
您在这里不需要test
命令(也称为[
),if
将测试命令是否成功,在这种情况下为grep
。
这假设设置了f
和current_table
,我也简化了您的引用。确保您引用文件名("$f"
),以防文件名包含空格。
答案 1 :(得分:0)
我的第一个猜测是脚本中未定义current_table
变量。
在脚本中,应确保同时定义了f
和current_table
变量并分配了值。
尝试一下:
if [ -z "${current_table}" -o -z "${f}" ] ; then
printf "one or both variables has no value\n"
printf "current_table=%s\nf=%s\n" "${current_table}" "${f}"
exit 1
fi
grep -q "Input file for table ${current_table} NOT FOUND" "${f}"
if [ $? -ne 0 ] ; then
printf "the line below was not found in the %s file.\n" "${f}"
printf "Input file for table %s NOT FOUND\n" "${current_table}"
fi
不需要cat
命令,因为grep
可以直接搜索文件。
首选使用printf
答案 2 :(得分:0)
通常最好在提问时提供一个最小的工作示例,这有助于人们重现您的问题。
您可能在日志/模式中遇到"
的问题。
这是您尝试执行的工作示例。我已将-n
添加到grep
中,以便您看到匹配的行:
/t/tmp.mCbnzfsCnb> cat logfile
line 1
Input file for table Users NOT FOUND
line 3
Input file for table "Users" NOT FOUND
line 5
。
/t/tmp.mCbnzfsCnb> cat grep-example.sh
#!/bin/bash
set -exuo pipefail
f=logfile
current_table=Users
if [ "$(cat $f | grep -n -m1 'Input file for table '"$current_table"' NOT FOUND')" != "" ]; then
echo "OK - no quotes"
fi
if [ "$(cat $f | grep -n -m1 'Input file for table "'$current_table'" NOT FOUND')" != "" ]; then
echo "OK - quotes in the log"
fi
# Alternative syntax (no cat, no test)
if grep -n -m1 'Input file for table '"$current_table"' NOT FOUND' "$f"; then
echo "OK - alternative no quotes"
fi
if grep -n -m1 'Input file for table "'$current_table'" NOT FOUND' "$f"; then
echo "OK - alternative no quotes"
fi
。
/t/tmp.mCbnzfsCnb> ./grep-example.sh
+ f=logfile
+ current_table=Users
++ cat logfile
++ grep -n -m1 'Input file for table Users NOT FOUND'
+ '[' '2:Input file for table Users NOT FOUND' '!=' '' ']'
+ echo 'OK - no quotes'
OK - no quotes
++ cat logfile
++ grep -n -m1 'Input file for table "Users" NOT FOUND'
+ '[' '4:Input file for table "Users" NOT FOUND' '!=' '' ']'
+ echo 'OK - quotes in the log'
OK - quotes in the log
+ grep -n -m1 'Input file for table Users NOT FOUND' logfile
2:Input file for table Users NOT FOUND
+ echo 'OK - alternative no quotes'
OK - alternative no quotes
+ grep -n -m1 'Input file for table "Users" NOT FOUND' logfile
4:Input file for table "Users" NOT FOUND
+ echo 'OK - alternative no quotes'
OK - alternative no quotes
请注意,两个选项之间的区别非常细微:"'
与'"
还请注意,在进行故障排除时,可以使用set -x
逐步查看正在执行的操作。