猫文件名| grep -i在.sh脚本上不起作用

时间:2018-09-03 09:03:25

标签: bash shell

我需要读取一个日志文件,并检查该文件中是否有某个字符串。

我实际上正在尝试在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

有人可以解释我错了吗?有什么建议吗?

3 个答案:

答案 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(以及tailsed等过滤程序)。

您在这里不需要test命令(也称为[),if将测试命令是否成功,在这种情况下为grep

这假设设置了fcurrent_table,我也简化了您的引用。确保您引用文件名("$f"),以防文件名包含空格。

答案 1 :(得分:0)

我的第一个猜测是脚本中未定义current_table变量。

在脚本中,应确保同时定义了fcurrent_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逐步查看正在执行的操作。