概述四剑客特点
- find:擅长查找文件,与其他命令配合
- grep/egrep:过滤速度最快
- sed:过滤、取行、替换、删除;替换、修改文件内容,取行
- awk:过滤、取行、取列、统计、循环、判断;取列、取行、统计计算格式
取出/etc/passwd中的第1行的第1列、第3列和最后1列
awk -F: 'NR==1{print $1, $3, $NF}' /etc/passwd
- awk:命令
- -F::选项,指定分隔符为冒号
- ‘NR==1{print $1, $3, $NF}’:条件{动作},NR==1表示第一行,print $1表示输出第一列
- /etc/passwd:文件路径
执行流程
- 取行
- 取列
- 统计计算
取行操作
NR Number of Record 记录号 行号
== 等于 {print $0} 输出整行内容 $0表示当前行的内容,awk满足条件后默认的动作,输出这一行的内容 ,仅取行,还可以简写为awk 'NR==1 /etc/passwd'
取出/etc/passwd的第1行
awk 'NR==1 {print $0}' /etc/passwd
awk 'NR==1' /etc/passwd
- NR:Number of Record,记录号(行号)
- ==:等于
- {print $0}:输出整行内容,$0表示当前行的内容
取出第2行到第5行的内容
awk 'NR>=2 && NR<=5' /etc/passwd
- >=:大于等于
- &&:and符
从包含root的行到包含nobody的行
awk '/root/,/nobody/' /etc/passwd
取列操作
使用awk取出ls -lh的大小列和最后一列
ls -lh /etc/hosts | awk '{print $5, $9}'
ls -lh /etc/hosts | awk '{print $5, $NF}'
- $数字:表示取列,$1表示第1列,$0表示整行
- $NF:最后一列
- NF:Number of Field,每行有多少列
- $(NF-1):取出倒数第2列
awk输出与对齐
- $数字,表示取列,$1 第1列 $0 表示这一行
- $NF 最后一列
- NF Number of Fileld 每行有多少列
- $(NF-1)取出倒数第2列,一般用于正向取发生变或数字过大
ll -h | awk '{print $5, $9}' | column -t
ll -h | awk '{print $5"\t"$9}'
取出/etc/passwd中的第1列、第3列和最后1列
awk取列的时候,默认是通过空白字符进行分割的
- 空白字符:空格,连续空格,tab键
- 但是有时候使用默认分隔符不够了,需要我们手动指定分割符,通过-F 选项指定
- 选择分隔符建议:看你目标两边是啥
awk -F ':' '{print $1, $3, $NF}' /etc/passwd | column -t
- -F ‘:’:指定分隔符为冒号
指定复杂分隔符取出IP
ip a s ens33 | awk 'NR==3{print $2}' | awk -F '/' '{print $1}'
取出权限部分stat /etc/hosts的0644部分
stat /etc/hosts | awk -F '[^0-9]+' 'NR==4{print $2}'
stat /etc/hosts | awk -F '[/(]' 'NR==4{print $2}'
条件过滤
取出/etc/passwd文件中第3列大于100的行
awk -F ':' '$3 >=100{print $1, $3, $NF}' /etc/passwd | column -t
过滤出/etc/passwd第4列的数字以0或1开头的行
awk -F':' '$4 ~ /^[01]/ {print $1, $3, $4}' /etc/passwd
- ~:表示包含
- !~:表示不包含
统计计算
计算每行数字的总和
seq 10 > num.txt
awk '{i+=$1} END{print i}' num.txt
小结
- 取行和取列可以分开操作
- 取行(条件):NR==1、NR>=1、$3>=1000、$3~/1/
- 取列(分隔符、动作):1、1、1、NF、$(NF-1)
11万+

被折叠的 条评论
为什么被折叠?



