linux之awk命令
一、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,然后看下文件
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版