国内外贸网站,怎么更改网站首页图片,旅游攻略网站模板,重庆媒体网站建设单价1.awk的定义
awk是一种编程语言#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能#xff0c;是linux/unix下的一个强大编程工具。它在命令行…1.awk的定义
awk是一种编程语言用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能是linux/unix下的一个强大编程工具。它在命令行中使用但更多是作为脚本来使用。awk有很多内建的功能比如数组、函数等这是它和C语言的相同之处灵活性是awk最大的优势。
2.awk的使用方法
2.1 awk的语法
awk [options] script varvalue file(s)
awk [options] -f scriptfile varvalue file2.2 awk的命令常用选项
变量内置和自 -F fsfs指定输入分隔符fs可以是字符串或正则表达式如-F:
-v varvalue赋值一个用户定义变量将外部变量传递给awk
-f scripfile从脚本文件中读取awk命令
-m[fr] val对val值设置内在限制-mf选项限制分配给val的最大块数目-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能在标准awk中不适用3.awk变量
定义变量每个变量前加 -v 命令选项
3.1 内置变量
1格式
FS 输入字段分隔符默认为空白字符 OFS 输出字段分隔符默认为空白字符 RS 输入记录分隔符指定输入时的换行符原换行符仍有效 ORS 输出记录分隔符输出时用指定符号代替换行符 NF 字段数量共有多少字段 NF引用最后一列(NF-1)引用倒数第2列 NR 行号后可跟多个文件第二个文件行号继续从第一个文件最后行号开始 FNR 各文件分别计数, 行号后跟一个文件和NR一样跟多个文件第二个文件行号从1开始 FILENAME 当前文件名 ARGC 命令行参数的个数 ARGV 数组保存的是命令行所给定的各参数查看参数
[rootalong ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[rootalong ~]# awk -v FS: {print $1,$2} awkdemo #FS指定输入分隔符
hello world
linux redhat
along love
[rootalong ~]# awk -v FS: -v OFS--- {print $1,$2} awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[rootalong ~]# awk -v RS: {print $1,$2} awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[rootalong ~]# awk -v FS: -v ORS--- {print $1,$2} awkdemo
hello world---linux redhat---along love---
[rootalong ~]# awk -F: {print NF} awkdemo
2
4
3
[rootalong ~]# awk -F: {print $(NF-1)} awkdemo #显示倒数第2列
hello
lalala
love
[rootalong ~]# awk {print NR} awkdemo awkdemo1
1
2
3
4
5
[rootalong ~]# awk END{print NR} awkdemo awkdemo1
5
[rootalong ~]# awk {print FNR} awkdemo awkdemo1
1
2
3
1
2
[rootalong ~]# awk {print FILENAME} awkdemo
awkdemo
awkdemo
awkdemo
[rootalong ~]# awk BEGIN {print ARGC} awkdemo awkdemo1
3
[rootalong ~]# awk BEGIN {print ARGV[0]} awkdemo awkdemo1
awk
[rootalong ~]# awk BEGIN {print ARGV[1]} awkdemo awkdemo1
awkdemo
[rootalong ~]# awk BEGIN {print ARGV[2]} awkdemo awkdemo1
awkdemo13.2 自定义变量
自定义变量( 区分字符大小写)
1-v varvalue
① 先定义变量后执行动作print
[rootalong ~]# awk -v namealong -F: {print name:$0} awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you② 在执行动作print后定义变量
[rootalong ~]# awk -F: {print name:$0;namealong} awkdemo
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you2在program 中直接定义
可以把执行的动作放在脚本中直接调用脚本 -f
[rootalong ~]# cat awk.txt
{namealong;print name,$1}
[rootalong ~]# awk -F: -f awk.txt awkdemo
along hello
along linux
along along4.操作符
格式
算术操作符 xy, x-y, x*y, x/y, x^y, x%y
-x: 转along; print为数值字符串操作符没有符号的操作符字符串连接 赋值操作符 , , -, *, /, %, ^
a, --a比较操作符 , !, , , , 模式匹配符 ~ 左边是否和右边匹配包含
!~ 是否不匹配逻辑操作符 与 或|| 非!函数调用 function_name(argu1, argu2, ...)条件表达式三目表达式 selector?if-true-expression:if-false-expression5.awk控制语句
5.1 if-else判断
1语法
if(condition){statement;…}[else statement] 双分支
if(condition1){statement1}else if(condition2){statement2}else{statement3} 多分支2使用场景对awk 取得的整行或某个字段做条件判断
[rootalong ~]# awk -F: {if($310 $31000)print $1,$3} /etc/passwd
operator 11
games 1
[rootalong ~]# awk -F: {if($NF/bin/bash) print $1,$NF} /etc/passwd
root /bin/bash
along /bin/bash
---输出总列数大于3的行
[rootalong ~]# awk -F: {if(NF2) print $0} awkdemo
linux:redhat:lalala:hahaha
along:love:you
---第3列1000为Common user反之是root or Sysuser
[rootalong ~]# awk -F: {if($31000) {printf Common user: %s\n,$1} else{printf root or Sysuser: %s\n,$1}} /etc/passwd
root or Sysuser: root
root or Sysuser: bin
Common user: along
---磁盘利用率超过40的设备名和利用率
[rootalong ~]# df -h|awk -F% /^\/dev/{print $1}|awk $NF 40{print $1,$NF}
/dev/mapper/cl-root 43
---test100和90为very good; 90test60为good; test60为no pass
[rootalong ~]# awk BEGIN{ test100;if(test90){print very good}else if(test60){ print good}else{print no pass}}
very good
[rootalong ~]# awk BEGIN{ test80;if(test90){print very good}else if(test60){ print good}else{print no pass}}
good
[rootalong ~]# awk BEGIN{ test50;if(test90){print very good}else if(test60){ print good}else{print no pass}}
no pass5.2 循环语句
5.2.1 while循环
while(condition){statement;…}使用场景
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
---以along开头的行以为分隔显示每一行的每个单词和其长度
[rootalong ~]# awk -F: /^along/{i1;while(iNF){print $i,length($i); i}} awkdemo
along 5
love 4
you 3
---以为分隔显示每一行的长度大于6的单词和其长度
[rootalong ~]# awk -F: {i1;while(iNF) {if(length($i)6){print $i,length($i)}; i}} awkdemo
redhat 6
lalala 6
hahaha 6
---计算123...1005050
[rootalong ~]# awk BEGIN{i1;sum0;while(i100){sumi;i};print sum}
50505.2.2 do-while循环
do {statement;…}while(condition)意义无论真假至少执行一次循环体
6.awk数组
6.1 关联数组array[index-expression]
1可使用任意字符串字符串要使用双引号括起来
2如果某数组元素事先不存在在引用时awk 会自动创建此元素并将其值初始化为“空串”
3若要判断数组中是否存在某元素要使用“index in array”格式进行遍历
4若要遍历数组中的每个元素要使用for 循环**for(var in array)** {for-body}
[rootalong ~]# cat awkdemo2
aaa
bbbb
aaa
123
123
123
---去除重复的行
[rootalong ~]# awk !arr[$0] awkdemo2
aaa
bbbb
123
---打印文件内容和该行重复第几次出现 取反不会影响数组中的值 只有在得时候值才会改变 ?
[rootalong ~]# awk {!arr[$0];print $0,arr[$0]} awkdemo2
aaa 1
bbbb 1
aaa 2
123 1
123 2
123 3awk是AWK的命令行工具它接受一个AWK脚本作为参数并对输入进行处理。花括号{}内是AWK脚本的主体它定义了处理输入数据的操作。!arr[$0]这是一个表达式它使用了AWK中的数组arr来记录每一行的出现次数。在AWK中$0表示当前行的全部内容。arr[$0]表示以当前行内容为索引的数组元素。!是逻辑取反操作符将0转换为1非0值转换为0。arr[$0]表示将当前行内容为索引的数组元素自增1然后返回旧值。所以!arr[$0]在第一次遇到某一行时为真(1)而后续再次遇到该行时为假(0)。print $0,arr[$0]这是一个打印语句用于输出当前行内容$0以及该行内容在数组中出现的次数arr[$0]。在AWK中$0表示当前行的全部内容arr[$0]表示数组中以当前行内容为索引的元素的值。所以这段代码的作用是读取文件awkdemo2对每一行进行处理并输出每行内容及其在文件中出现的次数。如果文件中有多个相同的行则会在输出中显示它们的重复次数分析把每行作为下标第一次进来相当于print ias…一样结果为空打印空!取反结果为1打印本行并且变为不空下次进来相同的行就是相同的下标本来上次的值取反为空不打印变为不空所以每次重复进来的行都不打印
awk 关联数组 keyvalue 无序
[rootalong ~]# awk BEGIN{abc[ceo]along;abc[coo]mayun;abc[cto]mahuateng;for(i in abc){print i,abc[i]}}
coo mayun
ceo along
cto mahuateng
[rootalong ~]# awk {for(i1;iNF;i)abc[$i]}END{for(j in abc)print j,abc[j]} awkdemo2
aaa 2
bbbb 1
123 3