awk勇闯天涯

概述四剑客特点

  • 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:文件路径

执行流程

  1. 取行
  2. 取列
  3. 统计计算

取行操作

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 第1列 $0 表示这一行
  2. $NF 最后一列
  3. NF Number of Fileld 每行有多少列
  4. $(NF-1)取出倒数第2列,一般用于正向取发生变或数字过大
ll -h | awk '{print $5, $9}' | column -t
ll -h | awk '{print $5"\t"$9}'
取出/etc/passwd中的第1列、第3列和最后1列

awk取列的时候,默认是通过空白字符进行分割的

  1. 空白字符:空格,连续空格,tab键
  2. 但是有时候使用默认分隔符不够了,需要我们手动指定分割符,通过-F 选项指定
  3. 选择分隔符建议:看你目标两边是啥
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

小结

  1. 取行和取列可以分开操作
  2. 取行(条件):NR==1、NR>=1、$3>=1000、$3~/1/
  3. 取列(分隔符、动作):1、1、1NF、$(NF-1)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值