AWK 介绍
来源:互联网 发布:手机淘宝看不到支付宝 编辑:程序博客网 时间:2024/05/16 13:01
一.模式和动作
awk脚本是由模式和操作组成的:pattern {action}
pattern与{action}两者是可选的。如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。
模式可以是以下任意一个:
- 正则表达式:使用通配符的扩展集。
- 关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符
- 串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
- 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
- BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
- END:让用户在最后一条输入记录被读取之后发生的动作。
操作 由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
- 变量或数组赋值
- 输出命令
- 内置函数
- 控制流命令
二. 记录和域
记录:awk把每一个以换行符结束的行称为一个记录。
记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。
$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。
变量NR:一个计数器,每处理完一条记录,NR的值就增加1。
如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。
域:记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。
如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。
域分隔符:内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。
可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。
输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。
三 . awk内置变量
示例 动态获取文件名:
1 [root@mysql etc]# echo $PWD |awk -F/ '{print $4}'2 etc3 [root@mysql etc]# echo $PWD |awk -F/ '{print NF}' #浏览记录的域个数4 45 [root@mysql etc]# echo $PWD |awk -F/ '{print $NF}' #动态获最后一个域(文件命)6 etc7 [root@mysql etc]#
四 . awk操作符
4.1设置输入域到域变量名
#将$1的值赋给变量ip,ip再与正则匹配-bash-3.2$ awk '{ip=$1;if(ip ~/192.168/) print "IP is" ip }' access.logIP is192.168.2.1IP is192.168.2.1IP is192.168.2.1-bash-3.2$
4.2修改数值域取值
#将$1值 修改为:192.168.2.11-bash-3.2$ awk '{ if( $1=="192.168.2.1") $1="192.168.2.11"; print $1}' access.log192.168.2.11192.168.2.11192.168.2.11-bash-3.2$
4.3 汇总列值
-bash-3.2$ awk '(tot+=$4) { print $4 };END{ print "total is : " tot}' test.txt5013.143155.592142.033000.002000.002000.001000.0013083.415000.00total is : 36394.2-bash-3.2$
4.4 向一行awk命令传值
-bash-3.2$ who | awk '{if ($1 == user) print $1 " you are connected to:" $2}' user=$LOGNAME
4.5 通过while语句实现循环
-bash-3.2$ awk '{ i=1;while(i<NF) {print NF,$i;i++}}' test.txt
4.6 通过for语句实现循环
-bash-3.2$ awk '{ for(i=1;i<NF;i++) {print NF,$i}}' test.txt
注:在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
五 . 内置的字符串函数
示例:
5.1.gsubawk 'gsub(/^root/,"netseek") {print}' /etc/passwd 将与root开头的root替换为netseekawk 'gsub(/0/,2) {print}' /etc/fstabawk '{print gsub(/0/,2) $0}' /etc/fstab5.2.indexawk 'BEGIN {print index("root","o")}' 查询字符串root中o出现的第一位置awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwdawk -F: '{print index($1,"o") $1}' /etc/passwd5.3.lengthawk -F: '{print length($1)'} /etc/passwdawk -F: '$1=="root" {print length($1)}' /etc/passwd5.4.match (在ANCD中查找C的位置)awk 'BEGIN {print match("ANCD",/C/)}'5.5.split返回字符串数组元素个数awk 'BEGIN {print split("123#456#789", myarray, "#")}'5.6.sub 只能替换指定域的第一个0awk 'sub(/0/,2) {print }' /etc/fstab5.7.substr按照起始位置及长度返回字符串的一部分awk 'BEGIN {print substr("www.linuxtone.org",5,9)}' //第5个字符开始,取9个字符。awk 'BEGIN {print substr("www.linuxtone.org",5)}' //第5个位置开始,取后面的所有.
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- awk(4)-awk介绍
- AWK 介绍
- AWK介绍
- awk介绍
- awk介绍
- AWK介绍
- AWK介绍
- AWK 介绍
- awk介绍
- awk介绍 --z
- AWK命令介绍
- awk 运算符 介绍
- linux中AWK介绍
- awk编程介绍
- awk 入门介绍
- 介绍AWK用法
- Awk 入门介绍
- linux awk命令介绍
- java instanceof
- QML之Utility(Connections,Component,Timer,QtObject,Qt, WorkerScript,Loader,Repeater, SystemPalette,Fon
- 如何判断select是否是多选
- json
- RobotFramework+seleniumlibrary Web自动化测试 (四)
- AWK 介绍
- 突然间没了动力
- WPF模拟Office2010文件菜单的TabControl模板
- appwidget 窗口小部件onTouch事件及手势识别
- 实用面试题
- auto_ptr解析
- Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
- JavaScript中的Function函数
- uva-548 Tree