RUI个人博客 首页>>Linux>>[原] Linux学习笔记之 awk介绍 awk常用命令 awk内置变量 (awk上部曲)

[原] Linux学习笔记之 awk介绍 awk常用命令 awk内置变量 (awk上部曲)

Linux学习笔记之 awk内置的字符串函数 printf修饰符和格式 diff cmp (awk下部曲)

http://www.5ibig.com/article/index/arcid/64.htm

目录:

1. awk 介绍 (其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)
    1.1 -F选项 设定分隔符
    1.2 awk语句都是有模式和动作组成  模式包括BEGIN和END,动作在大括号{}内指明
2. 碰到awk错误时,查找的常见错误
3. 域和记录 $1,$2 。$0 为行信息   元字符   +?  
    3.1 条件操作符   <小于   <=小于等于   >大于  >=大于等于
    3.2 搜索特定的字符串
4. awk内置变量   ARGC命令行参数个数  FILENAME文件名  FNR浏览文件的记录数  FS设置输入域分隔符 

    NF 浏览记录的域个数  NR已读的记录数   OFS 输出域分隔符   ORS输出记录分隔符  RS控制记录分隔符

1. awk 介绍 (其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)
调用awk
· 有三种方式调用 awk
· 第一种是命令行方式
 awk [-F field-separator] 'command' input-file
· 第二种方法是将 awk 命令写入脚本,并以 awk 命令解释器作为脚本的首行,设置脚本有可执行权限,
  通过键入脚本名称来调用它
· 第三种方式是将 awk 命令插入一个单独文件然后执行
 awk -f awk-script-file input-file
[root@RAC1 tmp]# which awk
[root@RAC1 tmp]# type -a awk
[root@RAC1 tmp]# ls /bin |grep 'awk'
[root@RAC1 tmp]# ls /usr/bin |grep 'awk'

[root@RAC1 tmp]# ll /bin |grep 'awk'
[root@RAC1 tmp]# ll /usr/bin |grep 'awk'

    1.1 -F选项 设定分隔符
· 如果设置了 -F 选项,则awk每次度一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置 -F 选项,awk 假定空格为域分隔符,并保持这个设置知道发现一新行。当新行出现时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个杜金城将持续到文件尾或文件不再存在。
    1.2 awk语句都是有模式和动作组成  模式包括BEGIN和END,动作在大括号{}内指明
· awk语句都由模式和动作组成,省略模式部分,动作将时刻保持执行状态。
· 模式可以是任何条件语句或符合语句或正则表达式。模式包括两个特殊字段BEGIN和END。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印相关信息。
· 实际动作在大括号 {} 内指明
awk 'BEGIN{print "this is the start-----"}
     {print $1,$2,$3,........}
     END{print "This is the end"}' filename
[root@RAC1 tmp]# awk '{print $0}' greptest

[root@RAC1 tmp]# awk 'BEGIN{print "this is the begin";print "========="} \
> {print $0}' greptest

[root@RAC1 tmp]# awk 'BEGIN{print "============"}{print $0}END{print "this is the end";print NR}' greptest 

[root@RAC1 tmp]# cat -n greptest 

2. 碰到awk错误时,查找的常见错误
再碰到 awk 错误时,可相应查找:
· 确保整个 awk 命令用单引号括起来。
· 确保命令内所有引号成对出现。
· 确保用大括号括起动作语句,用圆括号括起条件语句。
· 可能忘记使用大括号,也许你认为没有必要,但 awk 不这么认为。
[root@RAC1 tmp]# awk '{if($1=="I") print $0}' greptest

3. 域和记录 $1,$2 。$0 为行信息   元字符   +?  
· 域和记录
  域标记为 $1,$2,$....$n。$0 为行信息
· 元字符 \  ^  $   .  []  |  *  +  ?
· + ?  只适用于 awk 而不适用于 grep 或 sed
· + 使用+匹配一个或多个字符
· ? 匹配0个或1个字符
    3.1 条件操作符   <小于   <=小于等于   >大于  >=大于等于

条件操作符
· <小于   <=小于等于   >大于   >=大于等于
· == 等于    !=  不等于
· ~ 匹配正则表达式  !~不匹配正则表达式

    3.2 搜索特定的字符串
    · 搜索特定字符串
[root@RAC1 tmp]# awk '$0~ /good/' greptest 
[root@RAC1 tmp]# awk '{if($0~/good/) print $0}' greptest
[root@RAC1 tmp]# awk '{if($0~/[BFI]/) print $0}' greptest 

    · 使用 [] 搜索字符.^在字符集合符号([])代表反向选择,在 [] 之外则代表定位在行首
[root@RAC1 tmp]# awk '{if($0~/[^BFI]/) print $0}' greptest 

   · 行首与行尾字符  ^  $
[root@RAC1 tmp]# awk '{if($0~/^[^a-zA-Z]/) print $0}' greptest 

[root@RAC1 tmp]# awk '{if($0~/!$/) print $0}' greptest

    · 任意一个字符. (绝对有一个字符) 与 重复字符 * (前面的字符是0个或多个)
[root@RAC1 tmp]# awk '{if($0~/g..d/) print $0}' greptest 
[root@RAC1 tmp]# awk '{if($0~/goo*/) print $0}' greptest 

[root@RAC1 tmp]# awk '$0~/good|glad/' greptest

[root@RAC1 tmp]# awk '{if($0~/good|glad/) print $0}' greptest

[root@RAC1 tmp]# awk '{if($0~/goo+/) print $0}' greptest 
[root@RAC1 tmp]# awk '{if($0~/goo?/) print $0}' greptest

   · 限定连续重复字符范围 {}
[root@RAC1 tmp]# awk '{if($0~/goo*/) print $0}' greptest

[root@RAC1 tmp]# awk '{if($0!~/goo?/) print $0}' greptest 

[root@RAC1 tmp]# awk '{if($0!~/good|glad/) print $0}' greptest 
[root@RAC1 tmp]# awk '{if($0~/good|glad/) print $0}' greptest

[root@RAC1 tmp]# ll /var/|tail|tee llvar
[root@RAC1 tmp]# cat -n llvar 

为了本次实验  手工修改了run的大小
[root@RAC1 tmp]# awk '{if($5==4096) print $0}' llvar |cat -n

[root@RAC1 tmp]# awk '{if($2<9) print $0}' llvar |cat -n
[root@RAC1 tmp]# awk '{if($2>9) print $0}' llvar |cat -n

[root@RAC1 tmp]# awk '{if($2>=9 && $8~/o/) print $0}' llvar |cat -n
[root@RAC1 tmp]# awk '{if($2>9 || $8~/t/) print $0}' llvar |cat -n

4. awk内置变量   

    ARGC命令行参数个数  FILENAME文件名          FNR浏览文件的记录数 

    FS设置输入域分隔符    NF 浏览记录的域个数     NR已读的记录数   

    OFS 输出域分隔符       ORS输出记录分隔符       RS控制记录分隔符

awk内置变量

ARGC
命令行参数个数
ARGV
命令行参数排列
ENVIRON
支持队列中系统环境变量的使用
FILENAME
awk浏览的文件名
FNR
浏览文件的记录数
FS
设置输入域分隔符
NF
浏览记录的域个数
NR
已读的记录数
OFS
输出域分隔符
ORS
输出记录分割符
RS
控制记录分割符
[root@RAC1 tmp]# awk '{print NF,NR,$NR,$0}' greptest 

[root@RAC1 tmp]# awk '{print NF,NR,$NF,$0}END{print "============";print FILENAME}' /tmp/greptest

[root@RAC1 tmp]# awk 'BEGIN{FS=":"}{print FS,NF,NR,$NF,$0}END{print FILENAME}' /etc/passwd


2016.12.08 于 北京邮储传   tyger.wang
昵  称:
邮  箱:
评论内容:
验 证 码:
可用[code][/code]插入代码
点击刷新验证码