Gret在反叛内的一个美元符号

时间:2014-06-20 14:00:02

标签: linux shell unix grep

我有一个像这样的文件

文件名:hello.txt

{1:ABC}{2:BCD}{3:{108:20140619-2}}{4:
:97A::Hi//12345
:97A::Hi//12345
:93B::Hello//FAMT/00000,
:16S:FIN
-}{5:{CHK:BDG6789}}{S:{ABC:}{DEF:S}{WOM:ONHGRT}}

现在基本上我正在检查是否存在$符号,以及:97A:并使用下面的if语句进行操作。

if [ `grep -c '\$' hello.txt` -gt 0 ] && [ `grep -c ":97A:" hello.txt` -gt 1 ]
then
echo "condition satisfied"
else
echo "condition not satisfied"
fi

如果我执行此im获取条件令人满意的echo语句。但是id应该是相反的方式:(因为即时通讯和条件。请帮忙。

5 个答案:

答案 0 :(得分:1)

grep -c '\$' hello.txt替换为grep -c '\\$' hello.txt然后它将按照需要运行。

例如:

bash -x test.sh 
++ grep -c '\$' hello.txt
+ '[' 0 -gt 0 ']'
+ echo 'condition not satisfied'
condition not satisfied

PS:bash -x是你的朋友:)

答案 1 :(得分:1)

我建议使用grep语法在子shell中执行$命令,然后进行比较。在我看来,这是一种更清洁的方式,并要求你不要成为逃避艺术家。

if [ $(grep -c '\$' hello.txt) -gt 0 ] && [ $(grep -c ":97A:" hello.txt) -gt 1 ]
then
echo "condition satisfied"
else
echo "condition not satisfied"
fi

对于hello.txt,输出将是:

>> bash test.bash 
condition not satisfied

由于您的文件中没有美元符号

[ $(grep -c '\$' hello.txt) -gt 0 ]

将测试

[ 0 -gt 0 ]

并且产生错误,而

[ $(grep -c ':97A' hello.txt) -gt 1 ]

将测试

[ 2 -gt 1 ]

并且产生真实。最后,假和&& true将产生false,第二个echo语句将被执行。

答案 2 :(得分:1)

我也不了解你的问题,但是根据你的代码,我得出的结论是你在为美元符号而烦恼。我想如果你使用反引号你也需要逃避反斜杠:

$ echo 'foo$bar' > dollar.txt
$ echo 'foo_bar' > no_dollar.txt

$ [ `grep -c '\$' dollar.txt` -gt 0 ] && echo 1
1

$ [ `grep -c '\$' no_dollar.txt` -gt 0 ] && echo 1
1

$ [ `grep -c '\\$' dollar.txt` -gt 0 ] && echo 1
1

$ [ `grep -c '\\$' no_dollar.txt` -gt 0 ] && echo 1

$ [ `grep -c '\\$' no_dollar.txt` -gt 0 ] || echo 0
0

或者,使用$()代替反引号

答案 3 :(得分:1)

  

“我正在检查是否存在$符号”

第一个条件不匹配,因为输入中的任何地方都没有“$”符号,因此第一个grep的输出为0.当0不大于0时,结果为“false”。因此,第二个条款根本不会被执行。 “条件不满足”,因为您对“满意”的要求是:输入包含“$”和“:97A:”。

对于grep是否匹配任何一行的结果,您不需要计算匹配数。

if grep -q '\$' file; then ...

是一种在没有rube-goldbergismns的条件语句中使用grep结果的方法

答案 4 :(得分:1)

使用awk并仅读取一次文件:

if awk '/[$]/{d++} /:97A:/{o++} END{exit !(d && o>1)}' hello.txt; then
    echo "condition satisfied"
else
    echo "condition not satisfied"
fi