awk

shell中的颜色处理

注意事项:
1、字背景颜色和文字颜色之间是英文的分号
2、文字颜色后面有个m 
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格 
4、echo显示带颜色,需要使用参数-e 
\033[0m 关闭所有属性 
\033[1m 设置高亮度,加粗
\033[5m 闪烁
[root@break du]# echo -e "\033[42;34m hello world \033[0m"
 hello world 
[root@break du]# echo -e "\033[34;34m hello world \033[0m"
 hello world 
 [root@break du]# echo -e "\e[25;34m hello world \e[0m"
 hello world 

在这里插入图片描述
在这里插入图片描述

awk

awk是由模式和动作组成。
模式:
正则表达式 :  /root/ 匹配含有root的行     	/*.root/
关系表达式:  <  >  &&  ||   +  *
匹配表达式:  ~  !~
动作:
变量  命令  内置函数  流控制语句
工作流程:读,写,重复读写
自定义变量:(1-6常用)
$n 当前记录的第n个字段,比如: $1表示第一个字段,$2表示第二个字段 
$0 这个变量包含执行过程中当前行的文本内容
FILENAME 当前输入文件的名
FS 字段分隔符(默认是空格) 
NF 表示字段数,在执行过程中对应于当前的字段数,NF:列的个数
NR 表示记录数,在执行过程中对应于当前的行号
FNR  各文件分别计数的行号
OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认是一个换行符)
常见的命令参数:
	-F  fs指定分隔符
	-v 赋值一个用户自定义变量
	-f 指定脚本文件,从脚本中读取awk命令

基于awk的简单实例

#指定分隔符
[root@break du]# echo A B C D ASD ASD | awk -F " " '{print $2}'
B
[root@break du]# echo "a|b|c|d" |awk -F "|" '{print $3}'
c
[root@break ~]# echo "12ax4576ax789ax978ax890" | awk -F "ax" '{print $3}'
789
#指定多个分隔符
[root@break ~]# echo "12ax4576ax789ax978ax890" | awk -F '[a8]' '{print $3}'
x7
[root@break ~]# awk -F: '{print $1}' /etc/passwd | head -5
root
bin
daemon
adm
lp
#使用预定义的变量和BEGIN
[root@break ~]# echo "12ax4576ax789ax978ax890" | awk -F "ax" '{print $3}'
789
[root@break ~]# echo "12ax4576ax789ax978ax890" | awk 'BEGIN {FS="ax"} {print $3}'
789
#取出IP地址
[root@break ~]# ifconfig ens33 | grep netmask
        inet 192.168.1.63  netmask 255.255.255.0  broadcast 192.168.1.255
[root@break ~]# ifconfig ens33 | grep netmask | awk '{print $2}'
192.168.1.63

基于awk的关系运算符

[root@break ~]# echo "3 2 4 5 6 23 32 2" >a.txt
[root@break ~]# awk '{print $1+10}' a.txt
13
[root@break ~]# vim a.txt 
[root@break ~]# cat a.txt 
3 2 4 5 6 23 32 2
1 34 654 567 89 8679
213 43 543 65 765 8
[root@break ~]# awk '{print $1+10}' a.txt
13
11
223
[root@break ~]# echo "q w e r t y u" | awk '{print $3}'
e
[root@break ~]# echo "q w e r t y u" | awk '{print $NF}'
u
[root@break ~]# echo "q w e r t y u" | awk '{print $(NF)-3}'
-3
[root@break ~]# echo "q w e r t y u" | awk '{print $(NF-3)}'
r

打印出passwd文件中用户UID小于10的用户名和它登录使用的shell

[root@break ~]# awk -F: '$3<10{print $1 ":" $NF}' /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
mail:/sbin/nologin
#单引号和双引号的区别
[root@break ~]# awk -F: '$3<10{print $1 "\t" $NF}' /etc/passwd
root	/bin/bash
bin	/sbin/nologin
[root@break ~]# awk -F: '$3<10{print $1 '\t' $NF}' /etc/passwd
root/bin/bash
bin/sbin/nologin
[root@break ~]# awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1 "\t" $NF}' /etc/passwd
du	/bin/bash

统计内存中的使用情况

统计当前内存的使用情况
内存的使用率:45.005%
[root@break ~]# cat mem.sh 
#!/bin/bash
echo "统计当前内存的使用情况"
U=`free -m | grep Mem | awk '{print $3/$2*100"%"}'`
echo -e "内存的使用率:\e[34:43m${U}\e[0m"

添加开始和结束的脚本

[root@break ~]# awk -f test.awk /etc/passwd
USERId			Shell
*****************
du                   /bin/bash           
******************
[root@break ~]# cat test.awk 
BEGIN{
	print "USERId\t\t\tShell"
	print "*****************"
	FS=":"
	}
$3>=500 && $NF=="/bin/bash"{
	printf "%-20s %-20s\n", $1,$NF	
}

END{
	print "******************"
}

awk的高级应用

高级使用参数说明:
	-F		指定分隔符
	-f		调用脚本
	-v		定义变量
	‘{}’	引用代码块
     {…}		命令代码块,包含一条或多条命令
	BEGIN	初始化代码块
	/ str /		匹配代码块,可以是字符串或正则表达式
	{print A;print B}		多条命令使用分号分隔
	END		结尾代码块
在awk中,pattern有以下几种:
1)empty空模式,这个也是我们常用的
2)/regular expression/  仅处理能够被这个模式匹配到的行
#打印以root开头的行
[root@break ~]# awk -F: '/^root/{print $1}' /etc/passwd
root
#输出行号大于等于3且行号小于等于6的行
[root@break ~]# awk -F: '(NR>=3&&NR<=6){print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
#提取IP地址(通过行号和通过关键字都可以来进行定位)
[root@break ~]# ifconfig ens33 | awk -F ' ' 'NR==2{print $2}'
192.168.1.63

NR和FNR的区别:NR是对于不同的文件都记录行数,FNR是根据不同的文件来分别记录文件的个数

[root@break ~]# awk '{print NR"\t" $0}' /etc/hosts /etc/hostname 
1	127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2	::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
3	break.cn
[root@break ~]# awk '{print FNR"\t" $0}' /etc/hosts /etc/hostname 
1	127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2	::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
1	break.cn

使用3种方法去除首行

[root@break ~]# route -n | grep -v ^Kernel
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@break ~]# route -n | awk 'NR!=1{print $0}'
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@break ~]# route -n | sed 1d
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

匹配,使用awk查出以包括root字符的行 , 有以下3种方法

[root@break ~]# awk -F: "/root/{print}" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@break ~]# awk -F: "/root/" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@break ~]# awk -F: "/root/{print $0}" /etc/passwd


[root@break ~]# awk -F: '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

如果passwd中UID小于10,则给变量USER赋值成aaa,否则赋值成bbb

[root@break ~]# awk -F: '{$3<10? USER="aaa":USER="bbb";print $1,USER}' /etc/passwd |head -4
root aaa
bin aaa
daemon aaa
adm aaa

如果UID大于10 ,则输出user=>用户名,否则输出pass=>用户名

[root@break ~]#  awk -F: '{if($3<10){print "user=>"$1}else{print "pass=>"$1}}' /etc/passwd | head -4
user=>root
user=>bin
user=>daemon
user=>adm

查出行号小于等于5且包括bin/bash的行

[root@break ~]# awk -F: '{if($3<=5 && $NF ~ "bin/bash"){print $1,$NF}}' /etc/passwd
root /bin/bash

使用单引号和双引号一起括起来

[root@break ~]# awk 'BEGIN{print "$var"}'
$var
[root@break ~]# awk 'BEGIN{print "'$var'"}'
asdf

格式化输出

[root@break ~]# awk -F: '{printf "%s",$1}' /etc/passwd 
rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-networkdbuspolkitdlibstoragemgmtrpccolordsaslauthabrtsetroubleshootrtkitchronyrpcusernfsnobodyqemuunboundglustertssusbmuxdgeoclueradvdpulsegdmgnome-initial-setupsshdavahipostfixntptcpdumpdu
[root@break ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd | head -4
root
bin
daemon
adm

在输出的字母前面添加自定义字符串username

[root@break ~]# awk -F: '{printf "username:%s\n",$1}' /etc/passwd | head -4
username:root
username:bin
username:daemon
username:adm

前后都做格式化输出

[root@break ~]# awk -F: '{printf "username:%s %s\n",$1,$NF}' /etc/passwd | head -4
username:root /bin/bash
username:bin /sbin/nologin
username:daemon /sbin/nologin
username:adm /sbin/nologin

内容的左右对齐

[root@break ~]# awk -F: '{printf "%10-s\n",$1}' /etc/passwd | head -5
root      
bin       
daemon    
adm       
lp        
[root@break ~]# awk -F: '{printf "%10s\n",$1}' /etc/passwd | head -5
      root
       bin
    daemon
       adm
        lp

第1列使用15个字符宽度左对齐输出,最后一列使用15个字符宽度右对齐输出

[root@break ~]# awk -F: '{printf "USERNAME: %-15s %15s\n",$1,$NF}' /etc/passwd | head -5
USERNAME: root                  /bin/bash
USERNAME: bin               /sbin/nologin
USERNAME: daemon            /sbin/nologin
USERNAME: adm               /sbin/nologin
USERNAME: lp                /sbin/nologin
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值