linux awk详细使用方法

awk是linxu里实用强大的字符类相关的处理程序,处理方式:逐行读取文件的方式+条件处理或统计。支持正规和扩展正规

1)基本操作方法

        格式:awk [选项] '[条件]{指令}' 文件
        其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
       Awk过滤数据时支持仅打印某一列,如第2列、第5列等。
        处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。
----------
 awk '{print $1,$3}' test.txt        //打印文档第1列和第3列
 df -h | awk '{print $4}'        //打印磁盘的剩余空间


2)选项 -F 可指定分隔符
        输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下:
----------
 awk -F: '{print $1,$7}' /etc/passwd   //以:为分割符
 awk -F [:/] '{print $1,$10}' /etc/passwd //多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段


3)awk常用内置变量
          '/条件/{print $1}'   可以加条件
        NR 文件当前行的行号
        NF 文件当前行的列数(有几列)
        输出每次处理的行号,以及当前行以“:”分隔的字段个数
----------
awk -F: '{print NR,NF}' passwd.txt //打印行,列号
awk '/pam/{print $1}' /var/log/secure 


4) awk 'BEGIN{命令} {print $1} END{命令]'  /a.txt BEGIN END 只执行一次
--------
awk -F:  'BEGIN{print "User   UID   HomeD"}/^[fshar].*/{print $1"   "$3"   "$6}' /etc/passwd | column -t  // 打印标题 条件打印项目 文件 //column -t 专用于对齐排列显示
awk 'BEGIN{a=0}/bash$/ {a++}END{print a}' /etc/passwd          //统计出文件bash结尾的行数 


5) awk [选项] '[条件]{指令}' 文件
 A.使用正则设置条件[模糊匹配]     
/正规/ 在一整行匹配  $n~/正则/ $1~/root/ $2~/xx/ $3!~/0/
--------
 awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd   //输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息
awk  -F: '$1~/ssh/' /etc/passwd  //找出第一列是ssh开头的行


 B.使用数值/字符串比较设置条件
    比较符号:==(等于) !=(不等于) >(大于)   >=(大于等于) <(小于) <=(小于等于)
--------
awk -F:  'NR==2{print}' /etc/passwd    //输出第3行(行号NR等于3)的用户记录
awk -F: '$3>=1000{print $1,$3}' /etc/passwd  //输出账户UID大于等于1000的账户名称和UID信息
   
 C.逻辑测试条件
--------
awk -F: 'BEGIN{print"USERS  PASSWD"}$2~/.{30,100}/{print$1" "$2}' /etc/shadow |column -t     //输出账户UID大于1000或者账户UID小于10的账户信息 并对齐显示
awk -F: '$3>10 && $3<15' /etc/passwd       //输出UID大于10小于15的账户信息


 D.数学运算
--------
seq  200 | awk  '$1%3==0{i++} END{print i}'  //统计3的倍数的数量
seq 100 | awk '$1%3==0{print}'               //打印能被3整除的数
awk 'BEGIN{x++;print x}' 
awk 'BEGIN{x=8;print x+=2}'
awk 'BEGIN{x=8;x--;print x}'
awk 'BEGIN{print 2*3}'
awk 'BEGIN{print 2+3}'
awk 'BEGIN{ print 23%8}'


 E.条件判断  if(判断){指令}   ||  if(判断){指令}else{指令}  || 数组循环  for(i in z){}
--------
awk -F: '{if($3<20){x++;print $1" "$3}}END{print "UID<20的总用户数:"x}' /etc/passwd | column -t   //单分支语句,判断第三列UID小于20的就打印出来,结尾打印出总数
awk -F: '{if($3<20){x++;print $1" "$3}else{y++}}END{print "UID<20的总用户数:"x " ""UID>20的总用户数:"y}' /etc/passwd | column -t   //多分支语句,判断第三列UID小于20的就打印出来,结尾打印出总数
awk -F: 'BEGIN{print"<USER> <UID>"}{if($3<20){x++;print $1" "$3}else{y++}}END{print "UID<20的总用户数:"x " ""UID>20的总用户数:"y}' /etc/passwd | column -t
awk 'BEGIN{a[0]++;print a[0]}'              //打印数组类加
awk 'BEGIN{a[0]=1;a[1]=22;for(i in a){print a[i]}}'    //for循环打印组


6)扩展
---------
awk  -F: '{print NR" "$1}END{print"一共有:" NF "列\n一共有:"NR"行"}' /etc/passwd /etc/passwd 打印行数 对应的第一列内容 结尾 打出总列数 和行数
awk -F: '$2~/.{30,100}/{print$1"--->"$2}' /etc/shadow   //列出第二列字符数在30-100以内的项
awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log   //提取IP地址及访问量
awk  '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr -k 2
ab -c 100 -n 1000 http://127.0.0.1/                               //模拟100人访问网站访问1000次 IP地址
netstat -apn | awk '/:80/{print}'   找到80端口的进程ID和服务名
 lsof -i:80    找出所有和80端口有关的进程ID和服务名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璐程风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值