grep 精确字符串变量

grep 精确字符串变量

我想从文件“aaa.log”及其后面的内容中 grep 确切的字符串“CAAJ”。

cat aaa.log

CAAJ:dd20gf:acldx009:rel7

CAAJ:dd20gi:acldx009:rel7

CAAJ:dd20gp:acldx0059:rel7

CAAJ-TEST:de27ff:acldx003:rel7

CAAJ-TEST:de27ei:acldx003:rel7

CAAJ-TEST:de27ep:acldx003:rel7

预期输出:

CAAJ:dd20gf:acldx009:rel7

CAAJ:dd20gi:acldx009:rel7

CAAJ:dd20gp:acldx0059:rel7

我正在尝试以下代码。我得到了 O/p。

grep -E '(^|)CAAJ(:|$)' aaa.log

CAAJ:dd20gf:acldx009:rel7

CAAJ:dd20gi:acldx009:rel7

CAAJ:dd20gp:acldx0059:rel7

但是当我使用变量而不是确切的字符串时,我无法获取 O/p

var=CAAJ

grep -E '(^|)${var}(:|$)' aaa.log

OR 

grep -E '(^|)"${var}"(:|$)' aaa.log

这些都不起作用。

我想使用变量而不是确切的字符串并获得所需的o/p

答案1

尝试这个..

awk -F: '$1=="CAAJ" aaa.log

在 awk 中使用变量

awk -F: -vv="$var" '$1==v' aaa.log

grep 命令

grep "^$var:" aaa.log

答案2

首先我不知道你想做什么思考括号正在起作用,但根本没有理由使用(^|).这意味着“字符串的开头,或者什么都没有”。我很惊讶它是有效的语法。

同样,(:|$)当您关心的所有事件都发生在同一时间时,这似乎毫无意义开始字符串的。

如果将变量放在双引号中,它将扩展。如果您将其放在单引号中,则不会。

您不需要扩展正则表达式来完成所有这些。


代替:

grep -E '(^|)'${var}'(:|$)'

使用:

grep ^CAAJ: aaa.log

或者:

var=CAAJ
grep "^${var}:" aaa.log

或者,由于您关心的字段分隔符是:,因此只需使用 Awk:

awk -F: '$1 == "CAAJ"' aaa.log

请注意,在最后一种情况下,单引号用于 shell,双引号用于 Awk。单引号内的所有内容(包括$1)都将按原样传递给 Awk。

答案3

尝试这个:

var=CAAJ;grep "^$var:" aaa.log;

答案4

尝试

grep -E "(^|)${var}(:|$)" aaa.log

相关内容