一, awk 的内置参数
$0: 表示整个当前行
$1: 每行第一个字段
$2: 每行第二个字段
$n: 每行第 n 个字段
awk 的参数: 分隔符
-F separator 设定分隔符 (默认为空格)
打印单个字段:
awk -F ':' '{print $3}' /etc/passwd
打印多个字段:
- awk -F ':' '{print $1,$3}' /etc/passwd
- awk -F ':' '{printf("User:%s UID:%s\n", $1,$3)}' /etc/passwd
- awk -F ':' '{print"User:"$1"\t"UID:"$3"}' /etc/passwd
NR: 每行行号
NF: 字段数量
- awk -F ':' '{print NR,NF,FILENAME}' /ect/passwd
- # 案例:
1, 显示 / etc/passwd 中用户名 ID 大于 100 的行号和用户名
- awk -F ":" '{if ($3>100) print NR,$1}' /etc/passwd
- awk -F ":" '$3>100{print NR,$1}' /etc/passwd
2, 在服务器的日志中找出 IP:43.226.164.120 的访问日期.
sed -n '/43.226.164.120/p' assess_log | awk '''{print substr($4,2)}'awk'/43.226.164.120/{print substr($4,2)}' assess_log
二, awk 的逻辑判断式:
~ 匹配正则表达式
!~ 不匹配正则表达式
== 等于
!= 不等于
< 小于
> 大于
awk -F ':' '$1~/^m.*{print $1}' /etc/passwd 打印以 m 开头的用户名
awk -F ':' '$1!~/^m.*{print $1}' /etc/passwd 不打印以 m 开头的用户名
三, awk 的扩展格式
command 扩展
BEGIN{print "start"}pattern{awk 命令}END{print "end"}
- # 案例: 制表显示 / etc/passwd 每行的行号, 每行的列数, 对应行的用户名
- awk -F ':' 'BEGIN {"User Line Col"}{print $1,NR,NF}END{print"-------------"FILENAME"-------------"}' /etc/passwd
- # 案例: 统计当前文件夹下的文件 / 文件夹占用的大小
- ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count}'
- ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count/1024/1024"M"}'
- # 统计显示 / etc/passwd 的账户总人数
- awk -F ':' 'BEGIN{count=0}{count++}END{print count}' /etc/passwd
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' /etc/passwd 排除空行
- # 统计显示 / etc/passwd 中 UID 中大于 100 的用户名
- awk -F ':' '$3>100{print $1}' /etc/passwd
- awk -F ':' 'BEGIN{count=0}$3>100{user[count++]=$1}END{for(i=0;i<count;i++) print i,user[i]}' /etc/passwd
- # 统计 access_log 日志中每个 IP 出现的次数
- awk '{arr[$1]++}END{for(key in arr)print key,arr[key]}' access_log
awk 和 sed 对比
1,awk 和 sed 都可以处理文本
2,awk 侧重于复杂逻辑处理
3,sed 侧重于正则处理
4,awk 和 sed 可以共同使用
面试问题
1, 修改某个目录下所有包含 AAA 的文件的文件名 改为 aaa[改文件名]
find . -name "*aaa*" -exec rename aaa AAA { } \;
2, 修改目录下所有的文件中, 包含 aaa 都改成 AAA[改文件内容]
sed -i 's/AAA/aaa/g' `grep AAA -rl . ` 反引号
sed 本身不改变文件内容, 要使用 - i, 然后看下文件
来源: http://www.bubuko.com/infodetail-3093927.html