搜索符号模式

时间:2015-04-23 09:32:45

标签: shell awk

我正在尝试使用这个awk脚本:

awk -v count=0 '/`),`/ { count++ } END { print count }' sample.sql

但是我收到以下错误:

ERROR:
awk: line 1: runaway regular expression /\),/ {..

为什么我收到此错误,我该怎么做才能修复它?

目标是用反引号计算行数并关闭括号,如:

INSERT INTO test (`id`, `Address`) VALUES (1,'Delhi'),(2,'Mumbai')
  

Thanx @Tensibai。我刚刚添加\ line to),.和它的作品。我的.sql   包含INSERT INTO testidnm)VALUES   (1,'德里&#39),(2,'孟买'),(3,'奈')...;所以,我确实搜索过),   起始计数= 1。有谁知道哪里会更好地搜索   算数。?

3 个答案:

答案 0 :(得分:2)

如果我正确地理解了你想要达到的目标(计算包含),的行),那么应该这样做:

awk '/\(`.*`\)`/ { count++ } END { print count }' sample.sql

无需初始化变量,匹配包含

的行
(` any text here `)

并增加要在末尾打印的计数器。

我对原始问题的一个小疑问是如何计算每行中的数值:

awk '/\(.*\),/ { n=split($0,a,"\),"); print n; ncount += n; count++;} END { print "Lines matched:",count,"total values:",ncount }'

此处针对具有多个值(匹配(text inside),)的每一行拆分),并将值的数量转换为变量n,然后打印n,求和值的数量和增加匹配的行数。

最后打印匹配的行和找到的总值。

警告这不计算只给出一个值的行。 (在最后一次之后没有,))

要避免上述警告,请仅关注INSERT语句:

 awk '/INSERT.*\(.*\),*/ { n=split($0,a,"\)(,|\n)"); print n; count++;} END { print count }' /srv/db-backup-20-10-2014.sql

添加INSERT作为起始单词,并在分割上添加一个选项,以便在结束括号后分隔逗号或换行符。

答案 1 :(得分:0)

你能否更清楚地了解你想要实现的目标,只要我能理解你正在尝试获取文件sample.sql中存在的行数,你也可以通过使用

awk -v count=0 '{ gsub("[^)]", ""); count++} END{print count}' sample.sql

答案 2 :(得分:0)

awk在第一次使用时初始化一个0的整数。如果要计算包含)的文件中的行,可以直接使用:

awk '/\)/{c++} END {print c}' input