标签:一个 经典的 passwd 模式 sub awk命令 另一个 ima 正则表达式
awk简介awk的命名是由其三位创始人的姓名首字母拼合而来,是一个非常厉害的数据处理工具。相较于同为文本三剑客之一的sed而言,sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理。因此,awk相当的适合处理小型的数据。
awk的一般用法格式:
awk  [options]  ‘  pattern {action statements;…} ‘  file… 处理流程
1.读入第一行,并将第一行的资料填入$0,$1,$2…等变数当中;
2.依据“条件类型”的限制,判断是否需要进行后面的“动作”;
3.做完所有的动作与条件类型;
4.若还有后续的【行】的数据,则重复上面1~3的步骤,知道所有的数据都读完为止。
内置变量
由上述的流程我们可以知晓,awk是以行为一次的处理单位,而以字段为最小的处理单位。那么awk是怎么知道数据得行数和字段数,这就需要awk内置变量了。
| 变量名称 | 变量意义 | 
|---|---|
| NF | 每一行($0)拥有的字段总数 | 
| NR | 目前awk所处理的是“第几行” | 
| FS | 目前的分割字符,默认是空格键 | 
| RS | 输入记录分隔符,默认一行为一条记录 | 
我们长用到的内置变量就是如上这些,但是除了内置变量的应用,还有awk的逻辑运算符,也在awk的应用中起到很重要的作用。
awk逻辑运算符
| 运算符 | 代表意义 | 
|---|---|
| > | 大于 | 
| < | 小于 | 
| >= | 大于等于 | 
| <= | 小于等于 | 
| == | 等于 | 
| != | 不等于 | 
值得注意的是那个“==“的符号,因为:
if-else
语法:
if(condition){statement;…} [else statement]
if(condition1){statement1}  else if(condition2){statement2}  else{statement3}例:当第三列uid大于1000打印“common user”,否则打印“root or Sysuser”
awk -F: ‘{if($3>=1000) printf "Common user: %s\n",$1;
else printf "root or Sysuser: %s\n",$1}‘ /etc/passwd
while循环
语法:
while(condition){statement;…}条件为“真”,进入循环;条件为“假”,退出循环
例:统计以空格开头首单词是linux16的记录的每个字段的字母数量
awk ‘/^[[:space:]]*linux16/   {i=1;while(i<=NF) {print $i,length($i); i++}}‘ /etc/grub2.cfg
for循环
语法:
for(expr1;expr2;expr3) {statement;…}例:将上例用for循环来做
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}‘ /etc/grub2.cfg
gsub函数
要在整个记录中替换一个字符串为另一个,使用(正则表达式格式,/目标模式/,替换模式)
例如改变将序号111改成222:
echo "111hah111ih111j" |awk ‘gsub(/111/,222){print $0}‘
sub函数
使用sub发现并替换模式的第一次出现位置。对比gsub,sub只替换第一个匹配到的位置
例:任意改变上例的字符串
echo "111hah111ih111j" |awk ‘sub(/111/,222){print $0}‘
substr函数
substr是一个很有用的函数。它按照起始位置及长度返回字符串的一部分。
例子如下:取出下列字符的前五个字符
 echo "lishuyang" |awk ‘{print substr($1, 1,5)}‘
length函数
返回所需字符串长度,例如检验某字符串返回名字及其长度,即字符串构成的字符个数。
例: 统计字符串“lishuyang”的长度
echo "lishuyang" |awk ‘{print length($0)}‘
split函数
使用split返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔
符-,例如AD2-KP9-JU2-LP,将之划分成一个数组。使用split,指定分隔符及数组名。此
例中,命令格式为(“AD2-KP9-JU2-LP″,parts_array,”-“),split然后返回数组下标数,这
里结果为4。
awk ‘BEGIN{print split("AD2-KP9-JU2-LP",parts_array,"-")}‘
标签:一个 经典的 passwd 模式 sub awk命令 另一个 ima 正则表达式
原文地址:http://blog.51cto.com/13866567/2168927