### awk
awk分为nawk,gawk
我们shell中常用的awk 其版本是gawk
“`
AWK会把file中的每一行(记录/可以指定分隔符),读入空间中并默认以空白(TAB\space\\n)等分割成几个字段,每个字段用$#表示$0表示整行本身
“`
awk [Option] ‘program’ file
option
-F:制定输入时的字段分隔符
-v:var=VAR:自定义变量
program:Pattern{Action}
pattern:相当于地址定界
action:
一、print:输出到终端(相当于s1hell中的echo)
print item1,item2
1)以逗号为分隔符
2)输出的各item可以是字符串或数值:当前记录的字段、变量或awk的表达式
(字符串要以双引号引起来,如果$#被引起来那么输出则是$#而不是$#转换出来的变量值)
3)如果省略item,相当于print $0
示例:基本工作方式
“`
awk ‘{print $2″:”$4}’ /etc/fstab
/etc/fstab:
/data:defaults
/apache:defaults
/md1:defaults
/dev/shm:defaults
/dev/pts:gid=5,mode=620
/sys:defaults
/proc:defaults
[root@zhangxiao ~]#
“`
变量:变量需和-v一起使用
内建变量:
FS:默认输入分隔符(列)
OFS:默认输出分隔符(列)
RS:默认输入分隔符(行)
ORS:默认输出分隔符(行)
NF:字段数量
NR:行数量(也叫记录数量)(从1..往后编)
FILENAME:当前处理的文件名(每一行显示)
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
awk -v FS=: ‘{print $1}’ file
查找全文,每行按:为分隔符的列输出$1到屏幕
自定义变量
1)-v VAR=VARLUE
变量名字区分大小写
2)在program中直接定义
在{中引用变量(除了位置变量)不需要写$符}
[root@zhangxiao ~]#awk -v A=”hello” ‘BEGIN{print A}’
hello
[root@zhangxiao ~]#
printf命令
printf FORMAT,item1,item2…
1)format必须给出
2)不会自动换行,如果需要显示必须给出换行符\n
3)format中需要分别为后面的每一个item制定一个格式化符号
格式符
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e.%E:科学计数法数值显示
%f:显示浮点数
%g,%G:以科学计数法或者浮点数形式显示数值
%f:显示字符串
%u:无符号整数
%%:显示%自身
修饰符
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度(不是小数可省略)
(默认为右对齐)
-:表示左对齐
+:显示数值符号
操作符
算数运算操作符
+
–
*
/
^
%
-x(负号)
赋值
=
+=
-=
*=
/=
++
—
比较
>
<
=
!=
>=
<=
模式匹配符
~ :是否匹配
!~:是否不匹配
匹配后面的pattern要加在//中间
例 :awk ‘$3~/bash$/{print $3}
逻辑操作符
&&
||
!
函数调用
founction_name(argu1,argu2….)
条件表达式:
selector?if-ture-expression:if-false-expression:三目表达式 如果真执行前面的表达式如果失败执行后面的表达式
PATTERN:
类似于地址定界
1):省略表示匹配每一行
2)/正则表达式/:仅处理能被此处的模式能匹配到的行
3)!//:对不匹配正则表达式匹配的行处理
4)关系型表达式:结果有真假(布尔值 ),结果为真的才处理
(结果非0或者非空时表示真。0和空字符串都表示假
6)//,//第一次匹配pattern1到第一次匹配pattern2
(此处不支持#,#的写法如果要用需要用判断如 wak -F: ‘(NR>=2&&NR<=10){print $1}
7)BEGIN/END模式:如果需要在文件处理之前或者之后执行一次的命令用这两个模式BEGIN{CMD}
常用的action
1)EXPRESSIONS:表达式
2)控制语句 :if while等
3)组合语句 :
4)输入语句
5)输出语句
控制语句:if(condition){statments}
if(condition){statments} else {statments2}
while (condition){statments}
do {statments} while (condition)
for(expr1;expr2;expr3){statments}
break,continue
delete array[下标]
delete array
exit
{statments}
详解控制语句
1) if(condition) statment {else statment}
示例:awk -v FS=: ‘{if($3>500) {print $3} else{print $1 ” is a user”}}’ /etc/passwd
使用场景,对awk取得的整行做条件判断
2)while(condition) statment
条件为真时进入循环,为假是跳出循环
使用场景:对一行内的多个字段进行注意处理时用,或对数组中的数据进行注意处理时需要用
length():内建函数,统计字符个数
示例
awk -F: ‘/root/{i=1;while(i<=NF){print $i,length($i);i++}}’ /etc/passwd
统计带有root的行每个单词以及单词的字符数
3)do-while循环
do statment while(condition)
至少执行一次循环体
4)for循环
for(expr1;expr2;expr3)statment
for(变量初始值;条件判断;变量修正) 循环体
示例
awk -F: ‘/root/{for(i=1;i<=NF;i++){if(length($i)>7){print $i,length($i)}}}’ /etc/passwd
for循环可以遍历数组中的每一个元素
语法
for (VAR in 数组名) 循环体
5)switch语句:
switch(expression){case VAR1 or /REGEXP/:statment;case VAR2 or /REGEXP/:statment2….default:statment}
6) continue和break
同shell
break [n]
continue
7) next :提前结束对本行的处理,直接进入下一行
8)数组
数组名[索引表达式]
索引表达式:
1)可以使用任意字符串
2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
要判断数组中是否存在此元素,使用index in array 格式 进行
如果我们想要显示数组的元素值,直接调用不需要加$。
函数
内置函数
rand() :取随机0-1之间小数(一次)
length(【s】):显示字符串的长度
sub(r,s,[t]):用R表示的模式来查找t所表示的字符中匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):全部替换
split(s,a,[r]):以r为分隔符 ,并将切割后的结果保存至a所表示的数组中
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99027