shell 文本处理三剑客之awk

awk是一款设计用于数据流的工具。它颇有颇有玩头的原因就在于可以对列和行进行操作。

awk工作模式(逐行读取)、分隔符

cat file
============================
ll 1045670921 80 97 70
kk 1234566789 90 90 90
hh 1233454562 60 60 60
jj 5234364142 59 58 57
aa 1232341234 23 34 12
============================

cat file | awk '{print $1}' #打印第一个字段
============================
ll
kk
hh
jj
=============================
#$0表示整行

#awk指定多个分割符     使用正则实现  如:[字符]+
cat file
===========================
ll::1045670921 80 97 70
kk:1234566789 90 90 90
hh 1233454562 60 60 60
jj 5234364142 59 58 57
aa 1232341234 23 34 12
============================

#现截取第二列
cat file | awk -F '[: ]+' '{print $2}'
=====================================
1045670921
1234566789
1233454562
5234364142
1232341234
=======================================

#截取IP
ifconfig ens33
=========================================================
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.217.128  netmask 255.255.255.0  broadcast 192.168.217.255
        inet6 fe80::922b:7ecd:f9be:d179  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:f8:95:35  txqueuelen 1000  (Ethernet)
        RX packets 22865  bytes 1756460 (1.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28685  bytes 21477189 (20.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
=========================================================

ifconfig ens33 | grep 't ' | awk -F '[ \t]+' '{print $3}'
#192.168.217.128

awk内置变量

cat file
=============================
ll 1045670921 80 97 70
kk 1234566789 90 90 90
hh 1233454562 60 60 60
jj 5234364142 59 58 57
aa 1232341234 23 34 12
=============================

#print自定义打印内容
cat file | awk '{print $1"\t"$2}'
===============================
ll      1045670921
kk      1234566789
hh      1233454562
jj      5234364142
aa      1232341234
===============================

#内置变量OFS定义输出分隔符
cat file | awk '{OFS="##"} {print $1,$2}'
===============================
ll##1045670921
kk##1234566789
hh##1233454562
jj##5234364142
aa##1232341234
==============================

#内置变量NF表示分隔符分割之后一共有多少段
cat file | awk '{print NF}'
==================================
5
5
5
5
5
=================================
#取最后一段
cat file | awk '{print $NF}'
=================================
70
90
60
57
12
=================================
#取倒数第二列 cat file | awk '{print $(NF-1)}'

#内置变量NR表示行号
cat file | awk '{print NR}'
===========================
1
2
3
4
5
===========================

#使用NR作为判断条件打印出要求的
awk 'NR>=3{print $0}' file
===========================
hh 1233454562 60 60 60
jj 5234364142 59 58 57
aa 1232341234 23 34 12
===========================

awk 的基本结构

awk [options] 'BEGIN{cmd} pattern {cmd} END{cmd}'

[options] 'BEGIN{cmd} pattern {cmd} END{cmd}'都为可选项


options 参数选项 如 —F。

BEGIN{cmd} 首先执行(只在最开始执行一次)。

pattern {cmd}  pattern 可以是正则表达式,条件语句及行匹配范围等。  {cmd}动作 在BEGIN{cmd}执行了之后,逐行读取这个文件,直到文件被读取完,再执行 END{cmd}。

END{cmd} 在文件读取完之后,最后执行。

cat file | awk 'BEGIN{print "==========grade=========="} NR>=3 {print $0}END{print "----------tail-----------"}'
##########################

==========grade==========
hh 1233454562 60 60 60
jj 5234364142 59 58 57
aa 1232341234 23 34 12
----------tail-----------

#########################

echo -e "line1\nline2" | awk 'BEGIN{print "BEGIN"} {print} END{print "END"}'
#使用不带参数的print时,它会打印出当前行
=============================================
BEGIN
line1
line2
END
============================================


#在awk的print语句中,双引号被当做拼接符
echo |awk '{var1="v1";var2="v2";var3="v3";print var1"-"var2"-"var3}'
=================
v1-v2-v3
=================
【echo命令向标准输出写入一行,因此awk的{}语句块只执行一次。如果awk的标准输入包含多行,那么{}语句块中的命令就会被执行多次。
{}类似于一个循环体,会对文件中的每一行进行迭代。】

#awk进行数学运算
#对每一列进行相加(横着加)
cat file | awk '{a=$3+$4+$5;print $0,a}'
=============================
ll 1045670921 80 97 70 247
kk 1234566789 90 90 90 270
hh 1233454562 60 60 60 180
jj 5234364142 59 58 57 174
aa 1232341234 23 34 12 69
=============================

#对行进行相加(竖着加)
cat file | awk '{a+=$NF}END{print a}'
#289

cat a.txt
#1
#2
#3
#4
#5
#6
#7
#8
#9
#10

cat a.txt | awk '{a+=$1}END{print a}'
#55

ps aux | head -2
=============================================================
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 128164  6820 ?        Ss   05:08   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
===========================================================

#计算进程所占用的cpu百分比
ps aux | grep '/usr'| awk '{a+=$3}END{print a}'
#0.3

#if判断语句
#awk '{if(){}else{}}'
cat file | awk '{if($3>=80){print $0}}'
===========================
ll 1045670921 80 97 70
kk 1234566789 90 90 90
===========================

awk '/^-/{if($5>100)print $0}' #取出大于100B的普通文件,正则匹配
===========================================================
-rw-r--r--. 1 root root  118 226 19:16 a.c
-rwxr-xr-x. 1 root root 1787 224 16:49 if_for_while.sh
-rwxr-xr-x. 1 root root  938 223 22:47 operator.sh
-rw-r--r--. 1 root root  102 224 19:28 redirect.sh
-rwxr-xr-x. 1 root root  586 223 17:40 string.sh
-rw-r--r--. 1 root root  181 226 18:07 text.txt
-rwxr-xr-x. 1 root root 1292 223 01:17 var.sh
===========================================================

cat file | awk 'BEGIN{a=2}{a++;print a}'
#3
#4
#5
#6
#7

#awk for循环
cat file | awk '{for(i=1;i<NF;i++){print $i}}'
#ll
#1045670921
#80
#97
#kk
#1234566789
#90
#90
#hh
#1233454562
#60
#60
#jj
#5234364142
#59
#58
#aa
#1232341234
#23
#34

#awk的正则表达式
seq 1 5 | awk '{if($0==3)print $0}'
#3

#awk while语句
 echo | awk '{i=1;while(i<10){print i;i++}}'
#1
#2
#3
#4
#5
#6
#7
#8
#9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值