使用awk的〜运算符

时间:2016-01-23 12:16:54

标签: linux bash unix awk

我正在使用基本的搜索功能,我正在使用bash。

基本上,我有一个$ file =“Books.txt”,其中我有以冒号分隔的值:

C++ Programming for Dummies:Bob:60:50:20
Catch Me If You Can: Mary Ann:40:30:20

前两列分别是标题和作者。我正在尝试搜索书籍的标题。

read -p "Title: " searchTitle

到目前为止,我有这段代码:

awk -v findTitle="$searchTitle" 'BEGIN {FS=":"; OFS=", ";} $1 ~ findTitle {print $1, $2, "$"$3, $4, $5}' $file

如果我在提示符中键入“Catch”,它会起作用 - 输出:

Catch Me If You Can, Mary Ann, $40, 30, 20

然而,如果我搜索“C ++”,它会给我两个 -

Catch Me If You Can, Mary Ann, $40, 30, 20
C++ Programming for Dummies, Bob, $60, 50, 20

我的问题是:为什么?因此,我应该只获得“C ++”一书。还有其他方法可以达到预期的产量吗?我试图找到答案,但无济于事。

2 个答案:

答案 0 :(得分:2)

您需要决定是否要在搜索中支持正则表达式。在任何情况下,您都必须使用read -r标志来防止它解释转义序列,而是将它们作为文字文本读取。

如果要搜索固定字符串而不是模式,请使用awk中的index()函数:

read -r -p "Title: " searchTitle
awk -F: -v OFS=", " -v search="$searchTitle" '
    index($1,search) {
        print $1, $2, "$"$3, $4, $5
    }
' books.txt

如果要支持正则表达式,代码应如下所示:

read -r -p "Title: " searchTitle
awk -F: -v OFS=", " -v search="$searchTitle" '
    $1 ~ search {
        print $1, $2, "$"$3, $4, $5
    }
' books.txt

但是,如果它们出现在模式中,则需要转义特殊的正则表达式字符。来自+的{​​{1}}是一个特殊的角色。

由于字符串被解析两次,一次由shell解析,一次由C++解析,因此需要对其进行双重转义:

awk

答案 1 :(得分:0)

这是因为〜运算符的rvalue应该是正则表达式,而正则表达式中的+具有特殊含义(它是一个量词:一次或多次)。< / p>

所以它匹配“Catch”中的C和“C ++”中的C,因为它们有一个或多个C.

如果你想搜索文字字符串“C ++”,你必须写“C\+\+