awk 学习

1. awk用例

今天用awk来统计一个字符出现的次数,总是比实际多一个。查了半天才发现问题所在。

文本tt.txt如下:

<lst name="responseHeader"><int name="status">0</int><int name="QTime">14</int></lst><str name="defaultCoreName">collection1</str><lst name="initFailures"/><lst name="status"><lst name="PassRecord2014"><str name="name">PassRecord2014</str><bool name="isDefaultCore">false</bool><str name="instanceDir">/home/solr-4.5.0/example/solr/PassRecord2014/</str><str name="dataDir">/home/solr-4.5.0/example/solr/PassRecord2014/data/</str><str name="config">solrconfig.xml</str><str name="schema">schema.xml</str><date name="startTime">2015-04-01T06:28:15.07Z</date><long name="uptime">1239572</long><lst name="index"><int name="numDocs">164090656</int><int name="maxDoc">208295993</int><int name="deletedDocs">44205337</int><long name="version">261232</long><int name="segmentCount">34</int><bool name="current">true</bool><bool name="hasDeletions">true</bool><str name="directory">org.apache.lucene.store.NRTCachingDirectory:NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/home/solr-4.5.0/example/solr/PassRecord2014/data/index.20150203122351874 lockFactory=org.apache.lucene.store.NativeFSLockFactory@73cb4cae; maxCacheMB=48.0 maxMergeSizeMB=4.0)</str><lst name="userData"><str name="commitTimeMSec">1421846399426</str></lst><date name="lastModified">2015-01-21T13:19:59.426Z</date><long name="sizeInBytes">42172898452</long><str name="size">39.28 GB</str></lst></lst><lst name="PassRecord2014_00"><str name="name">PassRecord2014_00</str><bool name="isDefaultCore">false</bool><str name="instanceDir">/home/solr-4.5.0/example/solr/PassRecord2014_00/</str><str name="dataDir">/home/solr-4.5.0/example/solr/PassRecord2014_00/data/</str><str name="config">solrconfig.xml</str><str name="schema">schema.xml</str><date name="startTime">2015-04-01T06:28:16.268Z</date><long name="uptime">1238381</long><lst name="index"><int name="numDocs">175829855</int><int name="maxDoc">194278346</int><int name="deletedDocs">18448491</int><long name="version">149815</long><int name="segmentCount">33</int><bool name="current">true</bool><bool name="hasDeletions">true</bool><str name="directory">org.apache.lucene.store.NRTCachingDirectory:NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/home/solr-4.5.0/example/solr/PassRecord2014_00/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@36656758; maxCacheMB=48.0 maxMergeSizeMB=4.0)</str><lst name="userData"><str name="commitTimeMSec">1421898315939</str></lst><date name="lastModified">2015-01-22T03:45:15.939Z</date><long name="sizeInBytes">38838948011</long><str name="size">36.17 GB</str></lst></lst><lst name="PassRecord2014_01"><str name="name">PassRecord2014_01</str><bool name="isDefaultCore">false</bool><str name="instanceDir">/home/solr-4.5.0/example/solr/PassRecord2014_01/</str><str name="dataDir">/home/solr-4.5.0/example/solr/PassRecord2014_01/data/</str><str name="config">solrconfig.xml</str><str name="schema">schema.xml</str><date name="startTime">2015-04-01T06:28:15.07Z</date><long name="uptime">1239586</long><lst name="index"><int name="numDocs">134166331</int><int name="maxDoc">134166331</int><int name="deletedDocs">0</int><long name="version">96590</long><int name="segmentCount">1</int><bool name="current">true</bool><bool name="hasDeletions">false</bool><str name="directory">org.apache.lucene.store.NRTCachingDirectory:NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/home/solr-4.5.0/example/solr/PassRecord2014_01/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@1f98a654; maxCacheMB=48.0 maxMergeSizeMB=4.0)</str><lst name="userData"><str name="commitTimeMSec">1421809078062</str></lst><date name="lastModified">2015-01-21T02:57:58.062Z</date><long name="sizeInBytes">26719674923</long><str name="size">24.88 GB</str></lst></lst><lst name="collection1"><str name="name">collection1</str><bool name="isDefaultCore">true</bool><str name="instanceDir">/home/solr-4.5.0/example/solr/collection1/</str><str name="dataDir">/home/solr-4.5.0/example/solr/collection1/data/</str><str name="config">solrconfig.xml</str><str name="schema">schema.xml</str><date name="startTime">2015-04-01T06:28:15.07Z</date><long name="uptime">1239586</long><lst name="index"><int name="numDocs">0</int><int name="maxDoc">0</int><int name="deletedDocs">0</int><long name="version">1</long><int name="segmentCount">0</int><bool name="current">true</bool><bool name="hasDeletions">false</bool><str name="directory">org.apache.lucene.store.NRTCachingDirectory:NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/home/solr-4.5.0/example/solr/collection1/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@4e850e8c; maxCacheMB=48.0 maxMergeSizeMB=4.0)</str><lst name="userData"/><long name="sizeInBytes">65</long><str name="size">65 bytes</str></lst></lst></lst>

需要查找其中numDocs出现的此处,为此下了一条执行语句,发现怎么结果都多1.

如下:

cat t.txt |awk  'BEGIN{c=0;} { for(i=0;i<NF;i++) if($i~/numDocs/)c++;} END{print c;}'

后来将每一个匹配到的域,才发现$0不应该去做匹配的。。。。。

2. 正则中需要转义的字符

特别字符

说明

$

匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘ ' ‘ '。要匹配 $ 字符本身,请使用 $

( )

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 (  )

*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *

+

匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +

.

匹配除换行符  之外的任何单字符。要匹配 .,请使用 

[ ]

标记一个中括号表达式的开始。要匹配 [,请使用 [

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n' 匹配字符‘n'' ' 匹配换行符。序列 ‘\' 匹配 “”,而 ‘(' 则匹配 “(”

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^

{ }

标记限定符表达式的开始。要匹配 {,请使用 {

|

指明两项之间的一个选择。要匹配 |,请使用 |


3. 匹配操作符(~)

用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。

4. 内置变量

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

5. 域分隔符

-F指定域分隔符为':',如:awk -F ‘:’

原文地址:https://www.cnblogs.com/dorothychai/p/4384040.html