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