awk in bash shell scripting



我使用awk函数进行模式匹配。如果awk包含像++或——这样的操作符,它会给我搜索错误。

例如在搜索

4) search_book题目:c++编程21天作者:

0 records found

但是没有c++(实际上没有c++,因为如果我输入C,我仍然会得到结果)

4) search_book题目:21天编程作者:

c++ Programming in 21 Days, Hacker Jane,$30.60, 18.10

c++编程的21天,J. D. Edwards,$50.03,15,10

c++ Programming in 21 Days, Paul Thompson,$45.00, 18.10

3 records found

这是awk编码

awk -F':' -v search="$title" '$1 ~ search { i++; printf "%s, %s,$%s,%s,%sn", $1, $2, $3, $4, $5 } END { printf "%d records foundn", i }' BookDB.txt

更新:我已经尝试了几个小时,但我仍然无法解决这个问题,如果我想在底部添加一个名为"找不到书"的新行,当找到0条记录时,我该怎么做?

我如何使它也不区分大小写?

     awk  -F':' -v search="$title" '{ if($1 == search) {printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5; i++ } else {printf "Book not found"} }END {printf "%d records foundn", i}' BookDB.txt 

给我像

这样的东西
Book not found  
Book not found 
c++ programming in 21 days 
Book not found

不显示"book not found"消息

 if [ "$title" != "" ] && [ "$author" = "" ] ; then  
 awk  -F':' -v search="$title" '{ if($1 == search) {printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5; i++ } else {printf "Book not found"} }END {printf "%d records foundn", i}' BookDB.txt 
 if [ "$i" < 1 ]; then
 echo -n "Book not found"
 fi

$1 ~ search将变量search视为正则表达式。如果您不希望这样做,您可以使用index函数,该函数搜索文字字符串,而不是正则表达式:

$ title='C++ Programming in 21 Days'
$ awk  -F: -v search="$title" '(index($1, search) != 0) { i++; printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5 } END { printf "%d records foundn", i }' BookDB.txt 
C++ Programming in 21 Days,  Hacker Jane,$30.60,18,10
C++ Programming in 21 Days,  J. D. Edwards,$50.03,15,10
C++ Programming in 21 Days,  Paul Thompson,$45.00,18,10
3 records found

index($1, search)返回字符串search在字符串$1中的位置。如果没有找到search,则index返回0

我把-F':'改成了-F:。这是因为:不是shell活动字符。引用它没有什么害处,但没有必要引用。

更新问题

获取book not found:

$ awk  -F: -v search="$title" '(index($1, search) != 0) { i++; printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5 } END { if (i) printf "%d records foundn", i ; else print "Book not found";}' BookDB.txt

如果您有GNU awk (gawk),那么添加不区分大小写是很容易的:

awk  -F: -v search="$title" 'BEGIN{IGNORECASE=1;} (index($1, search) != 0) { i++; printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5 } END { if (i) printf "%d records foundn", i ; else print "Book not found";}' BookDB.txt

如果这样更容易理解,下面是相同的代码分布在多行:

awk  -F: -v search="$title" '
BEGIN{
    IGNORECASE=1;
}
(index($1, search) != 0){
    i++;
    printf "%s, %s,%s,%s,%sn", $1, $2, $3, $4, $5
}
END{
    if (i) 
        printf "%d records foundn", i ;
    else
        print "Book not found";
}
' BookDB.txt

最新更新