Linux日常之命令awk
一. 命令awk简介
1. awk是一种编程语言,用于对文本和数据进行处理的
2. 具有强大的文本格式化能力
3. 利用命令awk,可以将一些文本整理成为我们想要的样子
4. 命令awk是逐行进行处理的
二. grep、sed、awk的简单比较
1. 命令grep,更适合单纯的查找或匹配文本
2. 命令sed,更适合对匹配到的文本进行编辑
3. 命令awk,更适合文本格式化,对文本进行较复杂的格式处理
三. 命令awk基本语法
awk [options] 'pattern{action}' file
1. 在没有options和pattern的情况下,使用命令awk
    
2. pattern包括两种特殊模式,分别是BEGIN和END
(1)BEGIN模式,是指命令在处理文本之前执行
    
(2)END模式,是指命令在处理文本之后执行
              
(3)BEGIN模式和END模式同时存在时,其中,BEGIN与END之间的{}相当于一个循环体,对文件中的每一行进行处理
    
3. 常用的参数
(1)-F,用于指定输入分隔符
    
(2)-v,用于设置变量的值
    
    
从文件中输入变量
    
四. 变量
awk中的变量分为内置变量和自定义变量两种
1. 内置变量
| FS | 输入字段分隔符,默认为空白字符 | 
| OFS | 输出字段分隔符,默认为空白字符 | 
| RS | 输入记录分隔符(输入换行符),指定输入时的换行符 | 
| ORS | 输出记录分隔符(输出换行符),指定输出时的换行符 | 
| NF | 当前行的字段数(当前行被分隔符分割成了几段) | 
| NR | 当前行的行号 | 
| FNR | 不同文件分别计数 | 
| FILENAME | 当前文件名 | 
| ARGV | 数组,保存的是命令行所给定的各参数 | 
| ARGC | ARGC数组的个数 | 
(1)FS:以“:”为字段输入分隔符,输出第1列和第2列
1)使用-F选项指定输入分隔符
    
2)使用内置变量FS指定输入分隔符,需要注意的是,使用变量时,要使用-v选项来指定对应的变量
    
(2)OFS:以“#”为字段输出分隔符,输出第1列和第2列
    
(3)RS:以“:”为行输入分隔符,输出对应的行号和当前行内容。
需要注意的是,两个红框中的内容,由于Jack和DEF、Alice和GHI之间没有“:”,所以在awk中被认作为同一行
    
(4)ORS:以“---”为行输出分隔符
    
(5)NF:当前行的字段数
其中,$NF表示的是最后一个字段的内容,$(NF-1)表示的是倒数第二个字段的内容
(6)NR:当前行号
(7)FNR:不同文件分别计数
    
(8)FILENAME:显示当前行的文件名
    
(9)ARGV:数组,保存的是命令行所给定的各参数
    
(10)ARGC:保存的是ARGV数组的个数
    
2. 自定义变量
(1)使用-v来自定义变量(在上第三节已介绍)
(2)在awk中直接定义
    
五. 格式化中,awk使用printf时需要注意的问题
1. 使用printf输出的文本不会换行,如果需要换行,可以在对应的“格式替换符”后加入“\n”进行转义
2. 使用printf输出时,“指定的格式”与“被格式化的文本”之间,要用“,”隔开
3. 使用printf输出时,“格式”中的“格式替换符”必须与“被格式化的文本”一一对应(个数要相同)
六. awk中的pattern模式
当awk进行逐行处理时,会把pattern作为条件,判断当前行是否满足条件,若跟pattern匹配,则进行后面的处理,否则,跳过当前行。
  
1. 正则表达式
awk下的正则表达式与grep下的区别:
1)awk下: awk '/正则表达式/{print}' /etc/passwd
2)grep下: grep "正则表达式" /etc/passwd
    
需要注意的是
1)在awk的正则表达式中,若出现"/",则需要进行转义,在其前面加"\"
2)当使用{x,y}类型次数匹配的正则表达式时,需要使用--posix选项或--re-interval选项
2. 行范围匹配
awk '/正则表达式1/,/正则表达式2/{action}' file
表示的是,从被正则表达式1匹配到的行开始,到被正则表达式2匹配到的行结束,之间所有的行都会执行对应的动作。
七. 关系运算符
| 关系运算符 | 含义 | 用法实例 | 
| < | 小于 | x<y | 
| <= | 小于等于 | x<=y | 
| > | 大于 | x>y | 
| >= | 大于等于 | x>=y | 
| == | 等于 | x==y | 
| != | 不等于 | x!=y | 
| ~ | 匹配 | x~/正则表达式/ | 
| !~ | 不匹配 | x!~/正则表达式/ | 
八. 条件判断
| 1 2 3 4 5 6 | if(表达式)    {语句1}elseif(表达式)    {语句2}else    {语句3} | 
实例
| 1 2 3 4 5 6 7 8 9 10 11 12 | awk'BEGIN{    test=100;    if(test>90){         print "very good";    }    elseif(test>60){        print "good";    }    else{       print "no pass";    }}' | 
九. 循环语句
1. while循环语句
| 1 2 | while(表达式)    {语句} | 
实例
| 1 2 3 4 5 6 7 8 9 | awk'BEGIN{    test=100;    total=0;    while(i<=test){        total+=i;        i++;     }            print total;             }' | 
2. for循环语句
1)第一种
| 1 2 | for(变量 in数组)    {语句} | 
2)第二种
| 1 2 | for(变量;条件;表达式)    {语句} | 
3. do循环语句
| 1 2 3 | do    {语句}while(条件)
 | 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号