我使用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