AWK的简单介绍
1. awk:报告生成器,格式化文本输出
2. 版本:New awk (nawk) ,GNU awk (gawk)
3. gawk:模式扫描和处理语言
4.基本的用法
1):awk [options] 'program'
2):awk [options] -f programfile var=value file…
3):awk [options] 'BEGIN{action;… }pattern{action;… }END{action;… }' file ...
awk程序是由:BEGIN语句;能够使用匹配模式的通用语句块,END语句块,3部分组成;其中:BEGIN开始执行,END:后执行
5.awk的基本选项
-F:分隔符:指明输入的时候用到的;默认的是空白
-v:var="ssd" 变量赋值
列子:
awk -F: 'BEGIN{print 100*2}{print 12356}END{print $1}' /etc/fstab
AWK的语言
1.基本的格式:awk [options] 'program' filename
2.Program:pattern{action statements;....}
3.pattern和action
pattern:部分决定了动作语句何时触发事件;BEGIN,END
action:statements对数据进行处理,放在{}指明动作;print / printf
4.分割符和域
awk执行时,由分隔符分割的字段(域)$1,$2....$n;称为域的标识,$0:表示为所有的域,
**注意事项:awk中的$2等与shell脚本中使用$1符号的含义是一样的**
文件的每一行称为记录
省略action,则默认执行 print $0 的操作
只显示匹配到的条件
awk -F: '{print $1,$3}' /etc/passwd
显示所有内容
awk -F: '{print $0}' /etc/passwd
AWK的工作原理
1.开始执行BEGIN{action.....}语句块中的语句
2.从文件或标准输入读取一行,然后执行pattern{action.....}语句块,会逐步扫描文件,从第一行到最后一行重复这个操作,一直到文件被读取完
3.当文件被读取到末尾时,开始执行END{action;。。。}语句块
4.BEGIN语句在awk开始从输入流中读取文件之前被执行,这BEGIN是可选语句,比如:初始化变量,打印表头等通常可以写在BEGIN语句块中
5.END语句块在awk从输入流中读取完所有的行之后,才被执行
6.pattern语句块中是命令中最为重要的部分,可以选的;没有提供pattern语句块,则默认执行{print},也就是每一个读取到的行,awk读取的每一行都将执行该语句块
awk中print
1.print 格式:print itme1,itme2.....
2.要点:
[,]作为分隔符
输出itme可以是字符串,也可是数值,当前记录的字段,变量或者是awk表达式
(注意事项:'{print "呵呵呵呵呵"}'字符串必须给双引号;否则会被识别为变量;数值可以不给)
如省略item,相当于print $0
3.awk 也支持正则表达式
4.wak内置了循环
正则表达式:
df | awk -F " +|%" '/^\/dev\/sda/{print $1,$5}' | sort -nr | head -1
在{$1,$5中} 的这个【,】 可以换成其他的代替;但是必须用双引号,引起来
df | awk -F " +|%" '/^\/dev\/sda/{print $1"dayu"$5}' | sort -nr | head -1
内置的循环
awk '{print "Hello,awk"}' ----->会进入交互式模式,等待输入,没输入一行,打印一次hello awk
默认的域是 $0;读取文件的所有内容并显示
awk '{print }' /etc/passwd 等同于 awk '{print $0}' /etc/passwd
/etc/passwd中有多少行,就打印多少
awk -F: '{print "wenjian "}' /etc/passwd
显示passwd中所有所用户和uid
awk -F:'{print $1,$3}' /etc/passwd
用空格作为分隔
awk -F:'{print $1"\t"$3}' /etc/passwd
awk -F:'{print $1"+=======================+"$3}' /etc/passwd
AWK的变量
**1.awk的内置变量**
FS:输入字段的分割符,默认为空白
OFS:输出字段分割符,默认是空白
RS:输入记录分割符,指定输入时的换行符
ORS:输出记录分隔符,输出时用指定的符号代替换行符
NF:字段数量
NR:记录号
FNR:各文件分别计数,记录号
FILENAME:当前的文件名
ARGC:命令行的参数
ARGV:数组,保存的是命令行所给定的各个参数
**2. 自定义变量区分字符的大小写**
-v var="value"
在program中直接定义
在引用变量时,不需要在前面加$
FS:列子
awk -v FS=":" '{print $1FS$3}' /etc/passwd
awk -F: '{print $1,$7,$3}' /etc/passwd
OFS:列子
awk -v FS=':' -v OFS='----' '{print $1,$3,$7}' /etc/passwd
RS:
awk -v RS='' '{print}' /etc/passwd
ORS
awk -v RS=":" -v ORS="*******" '{print}' /etc/passwd
NF:
awk -F: '{print NF}' /etc/passwd
NR:
awk -F '{print NF,NR}' /etc/passwd
awk END'{print NR}' /etc/fstab
FNR:
awk '{print FNR}' /etc/passwd /boot/grub
FILENAME
awk '{print FILEANME}' /boot/grub
ARGC:
awk '{print ARGC}' /etc/passwd /etc/fstab
ARGV
awk '{print ARGC,ARGV[0],ARGV[1],ARGV[2]}'/etc/passwd /etc/fstab --->可以具体显示出有哪些参数 ARGV[0] 数组 下标
自定义变量
awk -v test="hell" 'BEGIN{print test}'
awk 'BEGIN{test="ni hao";print test}'
awk -F: '{sex="male";print $1,sex,age;age=18}'/etc/passwd
printf命令
1.格式化输出:printf "FORMAT" ,itme1,itme2...
必须指定FORMAT
不会自动换行,需要给显示给出换行控制符\n
FORMAT中需要分别对应后面的每一个itme指定格式符
2.格式符:与itme相对应的
%c:显示字符的ASCII码
%d,%i:显示十进制在整数
%e,%E:显示科学计数法计数
%f:显示为浮点
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
3.修饰符号
#[.#] 第一个数字控制显示的宽度,第二个#表示小数点后的精度,比如%3.1f
-:左对齐,(默认是右对齐) %-10s
+ 显示数值的正负符号 %+d
printf 案列
awk -F: '{printf "%s",$1}' /etc/passwd
awk -F: '{printf "%s\n",$1}' /etc/passwd
awk -F: '{print "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Usrname: %s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Usrname: %-20s,UID:%10d\n",$1,$3}' /etc/passwd
awk -F: 'BEGIN{print "----------------------------------------------------"}{printf "Usrname:|- %-20s | UID:| %10d\n",$1,$3}' /etc/passwd
awk -F: 'BEGIN{print "USERNAME-----------------------------------------UID"}{printf " %-20s ------|------- %10d\n",$1,$3}' /etc/passwd
操作符号
1.算术操作
x+y, x-y, x*y, x/y, x^y, x%y
- x:转换为负数
+x:将字符串转换为数值
2.字符串的操作符,没有符号的操作符,字符串连接
3.赋值操作符
=, +=, -=, *=, /=, %=, ^=,++, --
4.比较操作符
==, !=, >, >=, <, <=
5.模式匹配符
~:左边是否匹配右边;包含
!~:是否不匹配
6.逻辑操作符
与&& 或|| 非!
7.三目表达式
selector?if-true-expression:if-false-expression
前面为真,执行中间,前面为假,执行结尾
awk 'BEGIN{i=0;print ++i,i}' 值为1,1
awk 'BEGIN{i=0;print i++,i}' 值为0,1
第一个先加在打印
第二个先打印在加
awk -F: '$0 ~ /root/{print $1}' /etc/passwd
awk -F: '$0 ~ /root/{print $0}' /etc/passwd
awk '$0!~ "root"' /etc/passwd
awk -F: '$3==0' /etc/passwd
逻辑操作符:
awk -F: '$3>=0 && $3<=600{print $1,$3}' /etc/passwd
awk -F: '$3>=0 || $3<=600{print $1,$3}' /etc/passwd
awk -F: '!($3==0){print $1}' /etc/passwd
awk -F: '!($3>=500){print $3}' /etc/passwd
三目表达式:
awk -F: '{$3>=1000?USRNAME="common user":USERNAME="system user";printf "%-15s:%s\n",USERNAME,$1}' /etc/passwd
AWK PATTERN
1.pattern :根据pattern条件,过滤匹配到的行,在进行处理,
1)如果没有指定,匹配文本每一行
2) /regular expression/:处理仅能匹配到的行,需要使用【//】括起来
awk '/^UUID/{print $1}' /etc/fstab :取出开头为UUID
awk '/!UUID/{print $1}' /etc/fstab:取反,不是UUID的第一行
3) relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
4) line ranges:行范围 (跟sed的 '//,//'一样)
startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式
5) BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
awk -F: 'i=1;j=1{print i,j}' /etc/passwd
awk '!0' /etc/passwd ; awk '!1' /etc/passwd
awk '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
awk -F: '!($NF=="/bin/bash"){print $1,$NF}' /etc/passwd
awk -F: '$NF~"/bash" {print}' /etc/passwd
awk -F: '!($NF~"/bash") {print}' /etc/passwd
范围的表示
awk '/^root\>/,/^nobo\>/{print $1} ' /etc/passwd
df | awk -F " +|%" '/^\/dev\/sda/{print $1,$5}'
awk -F : ‘BEGIN {print “USER USERID”} {print $1“:”$3} END{print “END FILE"}' /etc/passwd
awk -F : '{print "USER USERID“;print $1":"$3} END{print "END FILE"}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n--------------- "}{print $1,$3}' /etc/passwd
awk -F: ‘BEGIN{print “ USER UID \n--------------- ”}{print
$1,$3}’END{print “==============”} /etc/passwd
seq 10 | awk 'i=0'
seq 10 | awk 'i=1'
seq 10 | awk 'i=!i'
seq 10 | awk '{i=!i;print i}'
seq 10 | awk ‘!(i=!i)'
seq 10 |awk -v i=1 'i=!i'
for循环##
样例一:
#!/bin/bash
for((i=1;i<=100;i++));
do
echo $i
done
样例二:
#!/bin/bash
for i in $(seq 1 100)
do
echo $i
done
样例三:
#!/bin/bash
awk 'BEGIN{for(i=1; i<=100; i++) print i}'
样例四:
#!/bin/bash
for i in {1..100}
do
echo $i
done
版权声明:本文为weixin_44232712原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。