标签:out 获得 产生 $0 注意 字段 sep 字符串函数 for
AWK介绍
awk(名字来源于三个创始人姓氏首字母)是linux系统下文本编辑工具,是一门编程语言,有自己的基本语法和流程控制、函数。awk简单高效。
调用AWK
1.命令行方式 awk [-F field-separator] ‘commands‘ input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk 3.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
=========================================================================================================================
一、AWK基本语法
$0 当前所有字段 $1--$n 按照分隔符分割取到的第n列内容 FS 分隔符(默认空格) awk ‘BEGIN{FS=":"}{print $1}‘ /etc/passwd ;等价于awk -F: ‘{print $1}‘ /etc/passwd RS 换行符(默认回车) awk ‘BEGIN{RS=":"}{print $1}‘ /etc/passwd NF 字符列数,当前处理行的分割后的列数 awk -F: ‘{print NF}‘ /etc/passwd NR 行号 awk -F: ‘{print NR ":" $1}‘ /etc/passwd OFS (默认空格)输出字段分隔符 ORS (默认回车)输出记录分隔符
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项
自定义外部变量
-v:自定义变量
awk -v host=$HOSTNAME "BEGIN{print host}"
关系操作符
<、>、<=、>=、==、!=、~、!~ 比较符<等与其他的语言类似,重点说一下不一样的 ~:用来判断前面的列是否匹配后面的内容。例如awk -F: ‘$7 ~ /^\/bin/{print $0}‘ /etc/passwd(判断第7列是否以/bin开头,如果是打印该列) !~:不匹配
输出print和printf
print:直接输出 awk -F: ‘{print $1 ":" $2}‘ /etc/passwd printf:格式化输出(printf是一个函数,需要用到()) awk -F: ‘{printf(hello %s:%s\n),$1,$2}‘ 注意:printf需要手动增加\n来换行。使用%s来格式化,printf()外加入要替换的变量
二、AWK的流程控制
条件:
if语句 if(expression){action1}else{action2} 例如:产生10个数seq 10,通过if语句判断是单数还是双数 seq 10 |awk ‘{if($0%2==0){print $0"是双数"}else{print $0"是单数"}}‘ 如果只需要一个if分支,可以省略前面的if,比如awk -F: ‘$3<-10 {print $1}‘ /etc/passwd
while语句:while(expression){action} 例子:使用:分割/etc/passwd,并将每一列前加上列号 awk -F: ‘{i=1;while(i<=NF){print i":"$i;i++ }}‘ /etc/passwd
for语句: 第一种方法:for(i=0;i<=10;i++){action} 例子:使用:分割/etc/passwd,并将每一列前加上列号 awk -F: ‘{for(i=1;i<=NF;i++){print i":"$i}}‘ /etc/passwd 第二种方法:for(value in array){action} 当value在array的key中,进行下面的操作。awk的数组类似python中的字典。 例子:统计/etc/passwd第7列的值及对应的个数 awk -F: ‘{a[$7]++}END{for(i in a)if(i!=""){print i":"a[i]}}‘ /etc/passwd 说明:a[$7]:将$7作为数组a的key,然后统计对应的个数;然后遍历for(i in a),判断i是否在数组a的key中;如果存在则打印a[i],a[i]为对应key的值,这里指个数。
array[1]="hello" array["name"]="Jack" 数组类似python的字典,array[key值]="value值";key为索引,可以是数字也可以是字符串。 数组元素的删除:delete array["key"] 例子:定义了数组a的三个值,并打印结果查看 awk ‘BEGIN{a[1]="hello";a[2]="word";a["name"]="meitian";for(i in a){print "key为"i":value为"a[i]}}‘
三、awk函数
int(x) 返回x的整数部分的值,值不会四舍五入,只是取整 sqrt(x) 返回x的平方根 rand() 返回伪随机数r,其中0<=r<1,(伪随机数指返回的值都是上一次返回的同一个随机数) srand(x) 建立rand()新的种子数,如果没有指定就用当天的时间(使用srand()可以使得rand()返回不同的随机数) 例子:rand()产生一个随机数,通过srand()产生新的种子数,然后再差生一个随机数 awk ‘BEGIN{print rand();srand();print rand()}‘
sub("要替换的字符串","替换后的字符串值"):替换匹配到的第一个文本 echo "hello world world" | awk ‘{sub("world","meitian");print $0}‘ gsub("要替换的字符串","替换后的字符串值" ):开启全局替换,替换文本中所有匹配到的字符串 echo "hello world world" | awk ‘{gsub("world","meitian");print $0}‘
示例:
[root@t-enter ~]# echo "hello world world" | awk ‘{gsub("world","meitian");print $0}‘ hello meitian meitian [root@t-enter ~]# echo "hello world world" | awk ‘{sub("world","meitian");print $0}‘ hello meitian world
index("a","b"):返回字符串b在字符串a中开始的位置 awk ‘BEGIN{print index("hello world","world")}‘ length("s"):返回字符串s的长度,当没有指定s时,返回$0的长度 awk -F ‘BEGIN{print length("hello world")}{print lenght()}‘ /etc/passwd match("s","r"):如果正则表达式r在s中匹配到,则返回出现的起始位置,否则返回0 awk ‘BEGIN{print match("hello world","[wo]")}‘ split(s,a,sep) 使用sep将字符串s分解到数组a中,默认sep为FS。
例子:使用o做为分隔符,将"hello world"进行分割存储到数组a中 awk ‘BEGIN{print split("hello world",a,"o");for(i in a){print a[i]}}‘ [root@t-enter ~]# awk ‘BEGIN{print split("hello world",a,"o");for(i in a){print a[i]}}‘ 3 hell w rld
toupper(s):将所有小写字母转换成大写字母 echo "hello world" |awk ‘{print toupper($0)}‘ tolower(s):将所有大写字母转换成小写字母 echo "HELLO WORLD" |awk ‘{print tolower($0)}‘
function 函数名(参数1,参数2,...){语句;return 表达式} 例子:求和 awk ‘function sum(a,b){total=a+b;return total}BEGIN{print sum(2,3)}‘ 注意:函数必须写在BEGIN{}{}END{}的花括号之外的地方,不能放在任何{}内,否则会报错`return‘ used outside function context
四、实战
ifconfig eth0 | awk -F":| +" ‘/inet addr:/{print $4}‘
[root@t-enter ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:13:BB inet addr:192.168.174.5 Bcast:192.168.174.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fef3:13bb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1531377 errors:0 dropped:0 overruns:0 frame:0 TX packets:288458 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1593454324 (1.4 GiB) TX bytes:24880369 (23.7 MiB) Interrupt:19 Base address:0x2000
说明:
netstat -an |awk ‘/^tcp/{a[$NF]++}END{for(i in a){printf("%s:%d\n",i,a[i])}}‘
五、 在实战中可能用到的注意点
[root@t-enter tmp]# eval $(ls |grep search.contract-0.0.5-SNAPSHOT.jar |awk -F"-" ‘{printf("name=%s;version=%s\n",$1,$2)}‘) [root@t-enter tmp]# echo $name search.contract [root@t-enter tmp]# echo $version 0.0.5
[root@t-enter tmp]# a=$(ifconfig eth0 |awk -F":| *" ‘/inet addr/{print $4}‘) [root@t-enter tmp]# echo $a 192.168.174.5
标签:out 获得 产生 $0 注意 字段 sep 字符串函数 for
原文地址:https://www.cnblogs.com/quanyao/p/13648995.html