linux命令学习---awk实例

awk功能很强大,慢慢学习使用吧

下面使用均是学习视频总结整理出来的,每个方式都包含了至少一个实例,由于视频讲解难以面面俱到,后续再查询资料补充!

  • 简单打印列:
awk
数据统计,日志分析等
固定格式
awk 'pattern + { action }' file
比如:


#假如a.log里面的内容如下
hello world !
my name is zjj
5 is iter

对于a.log内容,每一行内容都默认以空格为分割符,即上述文字可以被分为4列:
第一列	第二列	第三列	第四列
hello	world	!
my		name	is		zjj
5		is		iter

示例:

#打印第一列($0表示所有列)
awk '{print $1}' a.log
输出:
hello
my
5

#打印第二列和最后一列
awk '{print $2,$NF}' a.log
输出:
world !
name zjj
is iter

#打印最后一列的前一列,对于a.log相当于第三列
awk '{print $(NF-1)}' a.log
输出:
world
iter

 

  • 行号和列数

对于文本,record表示行,field表示列,所以在awk里面NR(Number of record),
NF分别表示行数和列数
awk '{print NR,NF}' a.log
输出:
1 3
2 4
3 3
#1,2,3表示当前文本的行号;3,4,3则表示每行的总列数,符合a.log内容


#上述命令和下述命令的区别:
awk '{print NR NF}' a.log
输出:
13
24
33
#将行号和列数拼接在了一起


#NR和NF之间的","表示两者分割,默认的分隔符是空格,所以每行的数字,比如1和3,以空格分割:   1 3
#NR和NF之间的空格则表示两者连接,所以每行的数字,比如1和3,是字符串的连接: 13

#比如下面命令,$1和制表符之间是空格,表示两者连接,同时再和$2连接
#换句话说,也就是用制表符替换了空格作为连接符,这样可以使打印出来的信息各列对齐
awk '{print $1 "\t" $2}' a.log
输出:
hello   world
my      name

 

  • 默认分隔符


替换默认分隔符:
#使用-F可替换默认的分隔符,比如-F:将使用:来替换默认的分隔符
#首先查看/etc/passwd
awk '{print $0}' /etc/passwd | head -5
输出:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#以:分割且在第一列和最后一列之间用--连接,""是连接符
awk -F: '{print $1"--"$NF}' /etc/passwd | head -5
结果:
root--/bin/bash
bin--/sbin/nologin
daemon--/sbin/nologin
adm--/sbin/nologin
lp--/sbin/nologin


#awk默认使用空格作为输入分割符,如果要替换则使用FS
执行:awk 'BEGIN{FS=","}{print $1,$2}'
键盘输入:
>aa,bb,cc
输出:
>aa bb
#此时的输入分隔符已经被替换成了",",那么aa,bb,cc相当于三列,而aa bb cc相当于1列,打印第1,2列

#awk默认使用","作为输出分割符,如果要替换则使用OFS
awk 'BEGIN{OFS=","}{print $1,$2}'
>aa bb cc
>aa,bb
#本来输出第1,2列应该是aa bb,两者之间使用空格分割,这里被替换成了","
#输入输出分隔符都替换
awk 'BEGIN{FS=",";OFS=","}{print $1,$2}'
>aa,bb,cc
>aa,bb

BEGIN:语句设置计数和打印头部信息,在任何动作之前进行
END:语句输出统计结果,在任何动作之后

打印出passwd中用户UID大于1000的用户名和登陆sehll
>cat /etc/passwd | awk -F: '$3>1000{print $1 "\t" $3 "\t"  $7}' 
输出:
nfsnobody       65534   /sbin/nologin
mysql   1001    /bin/bash

打印出系统中能登陆的普通用户
>cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $3 "\t"  $7}' 
输出:
mysql   1001    /bin/bash

打印输出信息是加上表头(BEGIN)
>cat /etc/passwd | awk -F: 'BEGIN {print "NAME \t SHELL"} $3>1000 && $7=="/bin/bash" {print $1 "\t" $7}'
输出:
NAME     SHELL
mysql /bin/bash


打印输出信息是加上尾头(END)
>cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $7}END {print "NAME \t SHELL"}'
输出:
mysql   /bin/bash
NAME     SHELL

 

  • 条件表达式

#条件表达式
#注意字符串使用双引号,数字则不用
#匹配文本中第一列为"my"的行, 并输出所有列
awk '$1=="my"{print $0}' a.log
输出:
my name is zjj
#匹配数字
awk '$1==5{print $0}' a.log
输出:
5 is iter

#使用awk '$1=="5"{print $0}' a.log也能匹配

#打出第二行
awk 'NR=2{print $0}' a.log

#awk的内置函数可以赋值,这注意区分上面的格式,是否在{}内
#这里表示将第2列的值替换为xxxx,即隐藏输出
awk '{$2="xxxx"; print NR "\t" $0}' a.log
输出:
1       hello xxxx !
2       my xxxx is zjj
3       5 xxxx iter
#先输出行号,再拼接制表符,在输出所有的内容


命令格式:
awk [-F | -f | -v] 'BEGIN{} // {command1;commonand2} END{}' file
-F		指定分隔符
-f		调用脚本
-v		定义变量
''		引用代码块
BEGIN	初始化代码块
//		匹配代码块,可以是字符串或者正则表达式
{}		命令代码块,包含一条或多条命令
;		多条命令使用分隔符
END		命令结束代码块

 

  • 正则表达式


结合正则
正则的模式写在//之间
只要包含abc即可匹配
1:/abc/
实例:
"abc"
"xxabc"
"xxabcxx"
"xxab123cxx"	--不匹配

执行:awk '/abc/{print $0}'
键盘依次输入上述实例,符合要求则被输出,否则输出空

下面的实例操作方式相同!
a和c之间有一个字符即可
2:/a.c/
"aac"
"a.c"
"a c"
"xxabcxxxx"
#转义字符
3:/a\.c/
"/a.c/"

/a\/c/
"/a/c/"

4:^ &
^以后面内容开头
&以后面内容结尾
必须以abc开头
/^abc/
"abc"
"abcxxx"
必须以abc结尾
/abc$/
"abc"
"xxxabc"

5:[]
a和c之间只能匹配x,y,z,其他的都不行
/a[xyz]c/
"axc"
"ayc"
"azc"
"agc" --不匹配

a和c之间必须匹配a到z之间的值(不能为空和大写字母)
/a[a-z]c/
"aac"
"ac"	--不匹配
"aZc"	--不匹配

/a[a-zA-Z]c/
"aac"
"aZc"
"Aaac"

如果^在[]之间,表示非的意思
表示a和c之间不能出现a-z中的值
/a[^a-z]c/
"aac" --不匹配
"aZc"

6:* +
*前面的字符出现0次或多次
+前面的字符出现1次或多次

/a*b/
"b"
"ab"
"aaaab"
""

/a+b/
"ab"
"aaab"
"b"	--不匹配

7:?
出现或者不出现
a出现或者不出现
/a?b/
"b"
"ab"

8:{}
出现的次数
#ab必须出现3次
/ab{3}c/
"abbbc"
b出现3到4次
/ab{3,4}c/
"abbbc"
"abbbbc"
"abbbbbc"	--不匹配

b出现3到10次
/ab{3,10}c/
b至少出现3次,且只能包含b
/ab{3,}c/

9:()
把一段东西看做一个整体
/(ab)+c/
"abc"
"abababc"
"abbc" --不匹配
  • 编程语言

awk作为编程语言
awk '{a=1;b=2; print a + b}'
>回车输出3
awk '{a=1;b=2; print a b}'
>回车输出12

awk '{a=1;b=2;c=5 print a b+c}'
>回车输出15
>先计算b+c,得到5,再和1拼接得到15

数字和字符串一起计算时,只有数字在前面,awk才会把表达式作为数字运算

awk '{a=1;b="bbb";c=5 print b+c}'
>得到5
awk '{a=1;b="33bbb";c=5 print b+c}'
>得到38
awk '{a=1;b="bbb33";c=5 print b+c}'
>得到5

其他的后续再整理!

 

  • 实例
其他实例:

#将ifconfig中的实际ip替换,替换规则:将.替换为-
#如:127.0.0.1 替换为 127-0-0-1

>ifconfig

eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.94.129  netmask 255.255.255.0  broadcast 192.168.94.255
        inet6 fe80::20c:29ff:feca:bc99  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ca:bc:99  txqueuelen 1000  (Ethernet)
        RX packets 3561  bytes 346311 (338.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1564  bytes 345525 (337.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 4  bytes 340 (340.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 340 (340.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 00:00:00:00:00:00  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#获取指定行
>ifconfig | grep 'broadcast' | head -1
结果:inet 192.168.94.129  netmask 255.255.255.0  broadcast 192.168.94.255

#按照默认的空格分隔符提取第二列
>ifconfig | grep 'broadcast' | head -1 | awk '{print $2}'
结果:192.168.94.129

#对ip进行处理,以.为分割符,添加"-"
>ifconfig | grep 'broadcast' | head -1 | awk '{print $2}' | awk -F. '{print $1"-"$2"-"$3"-"$4}'
结果:192-168-94-129



获取df里面use>40的信息
[zhuangjiajie@localhost home]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        36G   13G   23G  37% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G   84K  1.9G   1% /dev/shm
tmpfs           1.9G  9.0M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1       297M  144M  154M  49% /boot
tmpfs           378M   16K  378M   1% /run/user/42
tmpfs           378M     0  378M   0% /run/user/1000

>df -h | awk '/^\/dev/ {print $0}' | sed 's/%//g' | awk '$5 > 40 {print $1,$5"%"}'
解析:获取df信息,然后以"/dev/"匹配,打印出全部列,然后将%全局替换为空(去掉%才好进行大于小于的比较),
最后再以第五列大于40作为条件匹配,打印出第一和第五列,最后加上%


查询进程,杀掉之后重启脚本
ps -ef | grep apollo-portal | grep -v 'grep' | awk '{print $2}' | xargs kill -9 {} | xargs /wls/start.sh

 

后续再总结吧

 

 

转载于:https://my.oschina.net/u/1474131/blog/1836658

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值