【问题标题】:grep in IF statementIF 语句中的 grep
【发布时间】:2017-08-22 19:14:24
【问题描述】:

以下脚本部分读取$next 中的每一行。但是当我尝试 grep 特定模式,即"MO" in $next 时,错误在标准输出中显示为:

grep: 40922|OPR: No such file or directory  
grep: MO: No such file or directory  
grep: 12345|OPR: No such file or directory  
grep: MO: No such file or directory   
grep: 12345|12345|202|local|LMNO: No such file or directory  

cat /home/scripts/$E1.out | while read next  
do  
i=`echo $next | awk -F"|" '{print($1)}'`
j=`echo $next | awk -F"|" '{print($2)}'`
k=`echo $next | awk -F"|" '{print($3)}'`
l=`echo $next | awk -F"|" '{print($4)}'`
m=`echo $next | awk -F"|" '{print($5)}'`
n=`echo $next | awk -F"|" '{print($6)}'`
o=`echo $next | awk -F"|" '{print($6)}'`  
if grep -q "MO" $next  
then echo "FOUND;" >> /home/scripts/sql.$E1.out  
else echo "NOT FOUND;" >> /home/scripts/sql.$E1.out  
fi  
done  

$E1.out 文件看起来像:

40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO  

【问题讨论】:

  • 另外,您可以通过稍微更改读取命令来避免 awk 的所有调用:while IFS="|" read i j k l m n o; do ...(请注意,这只是为读取命令设置 IFS,因此您不必之后再设置)。

标签: bash


【解决方案1】:

您传递给grep$next 的参数被视为要搜索的文件名列表。如果您想在该行中搜索一个字符串,例如 MO,那么您需要将其放入文件中并将该文件作为参数传递,或者通过标准输入将其通过管道输入。

这是一个您可以在命令行上试用的示例;当然,将您使用的变量替换为我用来说明的文字值:

if echo "40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO" | grep -q "MO"
  then echo "FOUND"
  else echo "NOT FOUND"
fi

【讨论】:

  • 我们不能这样做吗:如果 echo "$next" | grep -q "MO" ?我的意思是我必须逐行搜索,$E1.out 中可以有很多行。
  • @Ashish 是的,您可以使用if echo "$next"。正如我所说,我将文字值放在那里是为了便于说明,但您可以将用于保存当前行的变量放入其中。
【解决方案2】:
if grep -q "MO" ${E1}.out then
  echo "found"
else
  echo "not found"
fi

【讨论】:

    【解决方案3】:
     if tmux ls | grep -q "ABC"; then echo "1";  else echo "2"; fi
    

    【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多