是一种文本处理工具
加载一行处理一行
1.awk [选项] '表达式 {处理动作}' 文件1 文件2 ……
满足表达式就处理,不满足表达式就不处理
2.awk -f 脚本文件 文件1 文件2……
-F : 指定分隔符
-v : 指定变量
awk的语言的表达式
1.不写就没有效果
2.找到特定的行
print 打印
printf 打印
计算:100+200
awk '{print $n}' 以空格为分隔符,取第n列
awk -F: '{print $n}' 以冒号为分隔符 取第n列
awk 内置变量和设立了环境中 的变量会有冲突,所以用'{ }'
如:awk '{print $2}' 以空格为分隔符取第二列
语法:awk [选项] '模式{处理动作 }'
如果模式为空,则每一行都要处理
FS :列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
OFS:决定输出时的分隔符
RS: 决定行分隔符,RS=":" 指定冒号为行分隔符。
NF:当前处理的行的字段个数
示例:倒数第二列:$(NF-1)
倒数第一列:$(NF)
NR:显示行号
示例:NR==2,只显示第二行
awk 'NR==2{print $1}'
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
$0:一整行或者一整列
$1:第一列
$2:第二列
FILENAME:显示处理的文件名
关系表达式结果为真才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
seq 10|awk 'i=!i' 奇数行
seq 10|awk '!(i=!i)'偶数行
awk [选项] '模式{条件判断}'
1.NR==1,NR==4取区间行
awk -F: "NR==1,NR==4 {print $1}' /etc/passwd
'NR==1,NR==4 {print $1}' 取1-4行的第一列
2.打印所有/etc/passwd所有用户名(根据-F指定分隔符)
cat /etc/passwd|awk -F":" '{print $1}'
-F":" 以冒号作为分隔符
print $1 打印出第一列
3.打印磁盘已使用情况,去除%
df|awk '{print $5}'|awk -F% '{print $1}'
df|awk -F"[ %]+" '{print $5}'
df|awk -F"( |%)+" '{print $5}'
1.找到10点到11点之间的日志
awk '/10:00/,/11:00/{print $0}'
2.删除test里重复的行
awk '!a[$0]++' test
3.统计/etc/fstab文件中每个文件系统类型出现的次数
cat /etc/fstab |awk '^[^#]/{print}' |awk '{print $3}' |sort |uniq -c
'/^[^#]/ 提取不以#开头的行
$3 提取第三个字段
sort 排序
uniq -c 去重并统计次数
4.统计出/etc/fstab文件中每个真单词出现的次数
grep -o "\b[a-zA-Z]+\b" /etc/fstab
"\b[a-zA-Z]+\b" 以aA为开头到以zZ为结尾的整字符
+ 代表一个以上的字符
5.提取出字符串Yd$C@MO5MB%9&Bdh7dq+YVixp3vpw中的所有数字
echo "Yd$C@MO5MB%9&Bdh7dq+YVixp3vpw" |grep -o [0-9]
grep -o [0-9] 只输出匹配的内容,0-9的数字全部显示
6.提取主机名并放入原文件 test.txt
http://mail.kgc.com/index.html http://www.kgc.com/test.html http://study.kgc.com/index.html http://blog.kgc.com/index.html http://www.kgc.com/images/logo.jpg http://blog.kgc.com/20080102.html http://www.kgc.com/images/kgc.jpg
第一种写法:
cat test |awk -F"[/ .]+" '{print $3}' >>test
"[. /]" 以 . 或 / 为分隔符
$3 取第三个字段
第二种写法:
cat test |cut -d "/" -f3|cut -d "." -f1
7.查出/tmp/的权限,以数字方式显示
stat /tmp/|awk -F"[(/]" 'NR==4{print $2}'
8.查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd |sort -t: -n -k3 |tail -n1