linux 三剑客命令

发布时间 2023-07-25 15:37:42作者: 宁采臣open

Linux 命令集合

基础概念

1 软连接和硬链接

1.1 基础概念


#01 硬链接
硬链接(Hard links):可以这样理解,硬链接就是某个文件实体的别名。硬链接甚至可以使多个文件名拥有相同的inode,你可以为单个文件创建多个硬链接。在不同的文件系统中,inode可能产生冲突,所以不能为不同文件系统或分区的目录和文件创建硬链接。


#02 软连接
软链接(Soft links, Symbolic links):就像在Windows系统中创建快捷方式一样,创建软链接实际上相当于创建一个指向某个文件实体指针变量,可以为不同文件系统或分区的目录创建软链接。



1.2 如何创建软链接

语法格式

ln -s FILE_NAME LINK_NAME

​ -s 创建软连接 给谁创建 -目录或者文件 创建后的软链接名称

##Linux 原生态软连接
[root@master01 ~]# ll /
总用量 20
lrwxrwxrwx.   1 root root    7 7月  22 20:57 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 7月  22 21:00 boot
drwxrwxrwx    4 root root   27 7月  22 23:34 data
drwxr-xr-x   19 root root 3120 7月  22 22:43 dev
drwxr-xr-x.  80 root root 8192 7月  23 20:13 etc
drwxr-xr-x.   2 root root    6 7月  23 21:15 home
lrwxrwxrwx.   1 root root    7 7月  22 20:57 lib -> usr/lib				##软连接
lrwxrwxrwx.   1 root root    9 7月  22 20:57 lib64 -> usr/lib64			##软连接
drwxr-xr-x.   2 root root    6 4月  11 2018 media
drwxr-xr-x.   2 root root    6 4月  11 2018 mnt
drwxr-xr-x.   5 root root  199 7月  23 21:48 opt
dr-xr-xr-x  147 root root    0 7月  22 22:43 proc
dr-xr-x---.   3 root root  176 7月  23 21:16 root
drwxr-xr-x   27 root root  840 7月  23 21:04 run
lrwxrwxrwx.   1 root root    8 7月  22 20:57 sbin -> usr/sbin			#软连接
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
dr-xr-xr-x   13 root root    0 7月  23 21:54 sys
drwxrwxrwt.  12 root root 4096 7月  23 22:00 tmp
drwxr-xr-x.  13 root root  155 7月  22 20:57 usr
drwxr-xr-x.  20 root root  278 7月  22 21:59 var
 
解释下:	
		lrwxrwxrwx  l 代表软连接
					

#01 创建软连接  
[root@master01 opt]# ln -s html-v2  html

	解释下:
		   ln -s  给html-v2 创建软连接  名称叫 html
			


零.正则

  • 基础正则
  • 扩展正则

含义:帮助人门处理有规律的内容

01 区别

基础正则(bre basic ) 扩展正则(ere 121 extended )
区别1:符号不同 ^ $ . * [] [^] + | () {} ?
区别2: 支持的命令不同 grep/sed/awk/高级语言 egrep(grep -E) /sed -r /awk/高级语言

02 通配符

#01 含义
*  		匹配所有
{} 		生成序列
?		匹配任何一个字符


#02 匹配有规律的  {}
1) 无规律的
[root@aliyun day08]# echo {a,z,1,4,6}
a z 1 4 6

2)有规律的
[root@aliyun day08]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

3) 可以添加前后内容
[root@aliyun day08]# echo q{a..z}
qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz




03 基础正则

含义 应用场景
^ 以...开头的行
$ 以...结尾的行
^$ 空行(没有任何字符) 排除配置文件中的空行或带注释的行
. 任意一个字符
* 前一个字符出现零次或者零次以上
.* 所有 任何字符 匹配所有 ^.*zhangyuzhou
[] [abc] 相当于是1个字符 匹配a或者b或者c 一次匹配一个字符 与扩展正则+一起使用
[^] [^abc] 相当于是1个字符 不匹配a或者b或者c 排除 与扩展正则+一起使用
  • 空行 ^$
#01 grep 排除空行
[root@aliyun test]# egrep -v  '^$' 1.txt
I am zhangyuzhou teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://zhangyuzhou.blog.51cto.com
our size is http://blog.zhangyuzhouedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but zhangyuzhou!


#02 sed 
[root@aliyun test]#  sed -r -n '/^$/!p'  1.txt
I am zhangyuzhou teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://zhangyuzhou.blog.51cto.com
our size is http://blog.zhangyuzhouedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but zhangyuzhou!


#03 排除 awk 
[root@aliyun test]# awk '!/^($|#)/' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
AuthorizedKeysFile	.ssh/authorized_keys
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes




# 含义
. 	任意一个字符
* 	前一个字符连续出现零次或者零次以上 


1) * 详解
连续出现
1
1111111
11111111111

#01 案例
[root@aliyun test]# egrep  -n -o  '0*' 1.txt
7:000
9:00000

	解释下:匹配0 连续多个0
	
	
  • .*

# .* 匹配所有   连续出现 * + {} ? 
# 正则表达式的贪婪行 (增加条件 限制)

# 匹配 以^.*root:x 开头的行
[root@m01 files]# egrep  -o '^.*root:x' /etc/passwd
root:x



# 案例1) 匹配以m开头并且 以8结尾的行
[root@m01 files]# egrep '^m.*8$' zhangyuzhou.txt 
my qq is 49000448

#匹配 zhangyuzhou.txt中 以字母m开头并且以m空格即为的行
[root@m01 /server/files]# grep '^m.*m $' zhangyuzhou.txt 

  • [] 一个整体 每次匹配一个
#匹配数字
[0-9]
# 匹配字母
[a-z]
[A-Z]
[a-zA-Z]
[a-Z]


# 每次只匹配一个
[root@m01 files]# egrep  -o '[abc]' zhangyuzhou.txt 
a
b
a
c


# 匹配两个
[root@m01 files]# egrep  -o '[abc][eml]' zhangyuzhou.txt 
am
al
al
bl
bl



# 案例2) 匹配m和o开头 并且 !结尾的行
[root@m01 files]# egrep  -o '^[om].*[ .!]$' zhangyuzhou.txt 


# 案例3) 只显示文件中大小写字母
[root@m01 files]# egrep  -o '[a-Z]+' zhangyuzhou.txt


# 案例4)显示以.结尾的行
[root@m01 files]# egrep '\.$' zhangyuzhou.txt 
I teach linux.
not 4900000448.


  • [^] [^abc] 一个整体 排除a b c
## 排除 [^括号内容]
[root@m01 files]# grep '[^abc]' zhangyuzhou.txt 


1)进阶案例 
[root@m01 files]# egrep '^[0-9a-Z]*' /etc/passwd
egrep '^[0-9a-Z]+' /etc/passwd

找出字母和数字开头并且结束的内容

2) [^] 写法
[root@m01 files]# egrep '^[^:]*' /etc/passwd

[^:] 排除: ^ 以除了:冒号开头的连续的所有内容
找出来除了冒号开头和冒号以外的 所有内容


  • 制表符号

# 特殊符号
\n  回车键
\t  tab键
\b	退格键


[root@m01 files]# echo -e '\nolaboy'

olaboy
[root@m01 files]# echo -e 'dd\bolaboy'
dolaboy
[root@m01 files]# echo -e 'qwe\bolaboy'
qwolaboy


04 扩展正则

符号 含义
| 或者
+ 前一个字符连续出现1次或者1次以上
{} 固定/范围 连续出现
() 多含义
() 整体
() sed 反向引用 后向引用
? 前一个字符连续出现0次或者1次 有或者没有
  • | 或者
#01 或者
案例1) 匹配zhangyuzhou或者m的行
[root@aliyun test]# egrep  'zhang|m' 1.txt
I am zhangyuzhou teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://zhangyuzhou.blog.51cto.com


#02 匹配 oldboy 或者 oldbey
[root@aliyun test]# egrep  'oldb(o|e)y' 1.txt
my god ,i am not oldbey,but zhangyuzhou!
my god ,i am not oldboy,but zhangyuzhou!

#03 写法2 
[root@aliyun test]#  grep  'oldb[oe]y' 1.txt
my god ,i am not oldbey,but zhangyuzhou!
my god ,i am not oldboy,but zhangyuzhou!



## 注意

[]  每次匹配一个字符		[abc]      a b c 

#最佳推荐
单个字符 使用 [abc] [0-9] [a-z]
多个字符使用 zhang|yu|zhou|。。


  • + 前一个字符连续出现1次或者1次以上
##含义 前一个字符连续出现1次或者1次以上

# 统计单词出现的次数
root@m01 files]# egrep -o '[a-Z]+' zhangyuzhou.txt | sort -nr  | uniq -c

# 统计字母出现的次数
egrep -o '[a-Z]' zhangyuzhou.txt | sort -nr  | uniq -c


  • { } a{n,m} 前一个字符a连续出现至少n次,最多m次

# 语法格式
a{n,m}  前一个字符a 连续出现最少n次 最多m次

a{n} 前一个字符a 连续出现n次

a{n,} 前一个字符a 连续出现至少n次  	#基本不用

a{,m} 前一个字符a 连续出现最多m次		#基本不用


案例1)
[root@m01 files]# egrep '0{1,5}' zhangyuzhou.txt 
my qq is 49000448
not 4900000448.
[root@m01 files]# egrep -o '0{1,5}' zhangyuzhou.txt 
000
00000

[root@m01 files]# egrep '0{2,3}' zhangyuzhou.txt 
my qq is 49000448
not 4900000448.
[root@m01 files]# egrep -o '0{2,3}' zhangyuzhou.txt 
000
000
00

[root@m01 files]# egrep -o '0{3,4}' zhangyuzhou.txt 
000
0000


3) 案例 取出正确的身份证号
id.txt
金 211324198705244720
万 500224197105168312
任 1231231231zhangyuzhou
任 3zhangyuzhou
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
取出文件中正确的身份证号码的行


1) 开始书写
[root@m01 files]# egrep '[0-Z]{18}' shen.txt  
[root@m01 files]# egrep '[0-Z]{18,18}' shen.txt 
金 211324198705244720
万 500224197105168312
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X

[root@m01 files]# egrep '[0-9]{17}[0-9X]' shen.txt 
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X

解释下:匹配前17位连续为数字 最后一位是数字和字母 

[root@m01 files]# egrep '[0-9X]{18}' shen.txt 
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X

  • ( ) 后向引用
# 案例 给数字加大于和小于号
[root@ECs conf.d]# echo 123456 | sed -r 's#(.*)#\1#g'
123456

[root@ECs conf.d]# echo 123456 | sed -r 's#(.*)#<\1>#g'
<123456>

给每个数字加括号
[root@ECs conf.d]# echo 123456 | sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>


[root@ECs conf.d]# echo {1..10} |  sed -r 's#([0-9]+)#<\1>#g'
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>


  • ? 前一个字符出现了0次或者1次
cat<<EOF>>ta.txt
joooop
jooop
joop
jop
jp
EOF


[root@ECs conf.d]# cat ta.txt 
joooop
jooop
joop
jop
jp


#01  取出jp和jop
方法1
[root@ECs conf.d]# egrep 'jo?p' ta.txt 
jop
jp


一 awk 取列

1.1 基本用法

称呼
记录 record
字段 域 field
替换 gsub(/找谁/,"替换成什么",替换那一列 不写默认全部)
-v 修改或者添加 awk 默认变量
-vOFS= 指定 awk 默认字段分隔符 (内置)
printf 格式化输出
1. 取行
RS -vRS= 修改默认行与行之间的 标记 间隔符 记录行分隔符
ORS 输出当前记录分隔符
NR 记录号 行号 内置变量
2. 取列
-F (FS) 指定 字段分割符 默认是空格
NF 每一行有多少列 $NF 变量 内容
-v 修改或者添加 awk 默认变量
-vOFS= 指定 awk 默认字段分隔符 (内置)
-f 指定awk 脚本

1.2 取列案例

#01 找出系统中所有的用户?
[root@aliyun day04]# awk -F':' '{print $1}' test
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
chrony
sshd
tcpdump
nscd
saslauth


#02 打印第一列和最后两列
awk -F':' '{print $1,$(NF-1),$NF}' test  | column -t

解释下:
	$(NF-1) 倒数第二行
	$NF			倒数第一行
	


1.3 取行案例 取反

#01 取出前三行
[root@aliyun day04]# awk 'NR<=3' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#02 取出第8行到第12行 
[root@aliyun day04]# awk 'NR >=8 && NR <=12  {print NR,$0}' test
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


#03 排除空行 并统计
[root@station ~]# awk '$0 !~/^$/  {i++} END { print "总计行数: " i }' /etc/services
总计行数: 11159

解释下:
				$0 !~/^$/     $0 代表全部  
											! 代表取反 
				排除空行


#04 每隔5行打印一个空行
[root@aliyun ~]# awk '{if (NR%5==0) {print " "};print NR,$0 }' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin


解释下:
		NR%5==0		能被5整除的行 代表处理5行 



#04 找出/etc/passwd 用户ID和用户组ID 不一样的 所有用户
[root@aliyun ~]# awk -F':'  ' $3!=$4 {print}' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


解释下:
		$3!=$4  第三行 不等于第四行

1.4 取行取列结合案例

#01 取前五行的 第一列和最后一列 并显示行号
[root@aliyun day04]# awk  -F ':'  'NR<=5 {print NR,$1,$NF}' test  | column -t
1  root    /bin/bash
2  bin     /sbin/nologin
3  daemon  /sbin/nologin
4  adm     /sbin/nologin
5  lp      /sbin/nologin


1.5 取偶数和奇数

#01 取出前20行 所有的偶数行
[root@aliyun day04]# awk  'NR%2==0 && NR <=20  {print NR,$0}'   test
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 polkitd:x:999:997:User for polkitd:/:/sbin/nologin
18 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20 tcpdump:x:72:72::/:/sbin/nologin


#02 取出前20行 所有的奇数行
[root@aliyun day04]# awk  'NR%2==1 && NR <=20  {print NR,$0}'   test
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
17 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin


解释下:
	&& 				代表并且 需要条件全部成立
	NR%2==1		取出奇数行
	NR%2==0		取出偶数行


1.6 过滤 取反排除

  • 语法解析
#01  找出最后一列包含 sbin 
awk -F ':' '$NF ~/sbin/   {print $NF}' test

解释下:
  -F  						 指定分隔符 ':' 
  $NF ~/sbin/ 		 ' 从哪里找 '  ' ~ 模糊匹配 包含'  ' /找什么/ '
  {print $NF}			打印最后一列
  
  指定分隔符为 ':' 寻找最后一列 包含 sbin 的所有行。并打印最后一列 
  

#02 排除空行 并统计行号
[root@station ~]# awk '$0 !~/^$/  {i++} END { print "总计行数: " i }' /etc/services
总计行数: 11159

解释下:
		$0 !~/^$/		$0代表全部  !代表取反 

1.7 取IP地址 多个分隔符

#01 取出eth0 IP地址
[root@aliyun ~]# ip a | awk -F '[ /]+'     '/eth0$/ {print $3}'
172.26.138.198

解释下:
		-F '[ /]+' 指定多个分隔符:[ /]  分隔符是 空格和 /  
							 这里的 + 代表 连续匹配 匹配多次为一个分隔符
		/eth0$/		 过滤以 eth0 结尾的行  $代表 以什么什么结尾 
		

1.8 取出剩余内存

#01 取出可用内存 并且以人类可读对方式显示
1)查看可用内存
[root@aliyun ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1881828      956024       71312      124864      854492      613464
Swap:             0           0           0

2)取出内存 并换算
[root@aliyun ~]# free | awk '/^Mem/ {print $NF/1024 "MB"}'
598.441MB

解释下:
		print $NF/1024 "MB"  取出最后一列 并除以 1024 得到单位 MB
			除以:/
			乘以:*
			加法:+
			减法:-
		
		free  查看系统内存信息
			-h  以人类可读方式显示

1.9 取出磁盘剩余容量

#01 取出磁盘可用容量 已经使用百分比
[root@aliyun ~]# df | awk '/\/$/ {print   "可用对磁盘容量是:"$(NF-2)/(1024*1024) " GB" ,$(NF-1)}'
可用对磁盘容量是:18.2567 GB 52%

	解释下: 
			/\/$/    过滤以 / 结尾的行
			\				 转义字符;去掉命令原有的属性;回归命令本身;
			
	df
		显示文件系统使用率
			

2.0 变量的使用

#案例1
[root@aliyun awk]# cat 01.txt
waiwai 90 98 98 96 96 92
xiaoyu 70 77 85 83 70 89
gege 85 92 78 94 88 91
xingxing 89 90 85 94 90 95
bingbing 84 88 80 92 84 82
dandan 64 80 60 60 61 62

#01 请计算同学们各科的平均成绩
[root@aliyun awk]# awk '{ x=$2+$3+$4+$5+$6+$7;y=x/6;print $1,y}' 01.txt
waiwai 95
xiaoyu 79
gege 88
xingxing 90.5
bingbing 85
dandan 64.5

		解释: 
				x=$2+$3+$4+$5+$6+$7;y=x/6;print $1,y
				x 设置的变量 = 总成绩
				y 设置的变量 = 平均值
				; 分号 ,命令可以同时执行


#02 以循环的方式 取出平均分数
[root@aliyun 01-awk]# awk '{sum=0;for (i=2;i<=NF;i++) sum=sum+$i ;y=sum/NF;print $1,"总成绩: "sum,"平均分: "y}' 01.txt  | column -t
waiwai    总成绩:  570  平均分:  81.4286
xiaoyu    总成绩:  474  平均分:  67.7143
gege      总成绩:  528  平均分:  75.4286
xingxing  总成绩:  543  平均分:  77.5714
bingbing  总成绩:  510  平均分:  72.8571
dandan    总成绩:  387  平均分:  55.2857

	解释下:
		sum=0 因为每次循环的成绩累加
    i=2;i<=NF;i++   i 的默认值是2 从第二列开始 循环到NF最后一列 每次i++ 自增
    sum=sum+$i  sum 等于$i相加  ; $i 变量的值 就是每一列对应的值	



2.1 BEGIN 模式动作

BEGIN {} 含义 BEGIN {} 里面的内容 会在awk读取文件之前执行
应用场景 1. 进行统计或者计算 ?
2. 进行测试 awk 测试 gsub
3. 用来显示标题 ✅
#01 计算
[root@aliyun ~]# awk 'BEGIN {print 100*12}'
1200
[root@aliyun ~]# awk 'BEGIN {print 100*12+4}'
1204
[root@aliyun ~]# awk 'BEGIN {print 100*(12+4)}'
1600


#02 打印标题
[root@aliyun day05]# awk 'BEGIN{print "姓名","电话","微信"}' 
姓名 电话 微信


#02 案例 
cat <<EOT >/opt/day05/29.txt
waiwai 90 98 98 96 96 92 100
xiaoyu 70 77 85 83 70 89 60
gege 85 92 78 94 88 91 80
xingxing 89 90 85 94 90 95 93
bingbing 84 88 80 92 84 82 94
dandan 64 80 60 60 61 62 96
zhangbingbing 94 100 92 98 50 60 94
EOT

1)计算总分 平均分 并打印标题
[root@aliyun ~]# awk  'BEGIN{print "姓名","总成绩","平均分"}  {x=$2+$3+$4+$5+$6+$7+$8;y=x/8;print $1,x,y}' /opt/day05/29.txt  | column -t
姓名           总成绩  平均分
waiwai         670     83.75
xiaoyu         534     66.75
gege           608     76
xingxing       636     79.5
bingbing       604     75.5
dandan         483     60.375
zhangbingbing  588     73.5

2)每科成绩打印出来,并打印平均分总分和标题
[root@aliyun day05]# awk 'BEGIN{print "姓名\t" "英语\t" "语文\t" "数学\t" "物理\t" "化学\t" "生物\t" "美术\t" "总分\t" "平均分"} {x=0;for(i=2;i<=NF;i++)x+=$i;y=x/(NF-1) ;print $0,x,y}' /opt/day05/29.txt  | column -t
姓名           英语   语文   数学   物理  化学   生物   美术   总分   平均分
waiwai         90    98    98    96    96    92    100   670   95.7143
xiaoyu         70    77    85    83    70    89    60    534   76.2857
gege           85    92    78    94    88    91    80    608   86.8571
xingxing       89    90    85    94    90    95    93    636   90.8571
bingbing       84    88    80    92    84    82    94    604   86.2857
dandan         64    80    60    60    61    62    96    483   69
zhangbingbing  94    100   92    98    50    60    94    588   84



解释下:
		BEGIN{print "姓名\t" "英语\t" "语文\t" "数学\t" "物理\t" "化学\t" "生物\t" "美术\t" "总分\t" "平均分"}  打印标题
		{x=0;						给个初始值是0
		for(i=2;i<=NF;i++)x+=$i		循环相加 从i 第二列开始到最后一列结束 x 是相加结果
		;y=x/(NF-1)					y 计算平均分 由于第一列是姓名,需要去掉
		print $0,x,y				$0代表所有 
		

2.2 END 最后

END {} 含义 END {}
1. 用来显示计算结果 先进行统计 最后END {} 输出结果 ?
2. 显示尾部或者结束信息提示
公式 i++ == i=i+1 统计次数 一共有多少次/个 .....
j+=$2 === j=j+$2 计算总和 (累加)
数组 ++ h[$1]++ 分类统计 并显示
数组+= $???? h[$1]=h[$1]+$10 分类求和
#01 案例 统计/etc/下 所有文件大小
[root@aliyun day05]#  ll -t  `find /etc/ -type f`  | awk 'BEGIN{print "文件数量","总大小"} {i++;x=x+$5} END{print i,x/1024/1024"MB"}' | column -t
文件数量  总大小
2020      31.7197MB

解释下:
		END{print i,x/1024/1024"MB"} 


#02  案例3) 统计access.log 总计流程 状态码200的次数和流量 4开头或者5开头的

1) 流量总计
[root@m01 files]# awk '{sum=sum+$10} END {print sum}' access.log 
2478496663

2)状态码为200的所消耗的流量
[root@m01 files]# awk '$9==200  {i++ ; sum=sum+$10} END {print "状态码次数: "i "总计流量: "sum}' /var/log/nginx/access.log
状态码次数: 142666总计流量: 2476750207 


3) 状态码为4xx的次数和总流量
[root@m01 files]# awk '$9~/^4/ {i++ ; sum=sum+$10} END {print "状态码次数: "i "总计流量: "sum}' access.log
状态码次数: 4623总计流量: 1606833

4) 状态码为5xx的次数和总流量
[root@m01 files]# awk '$9~/^(4|5)/ {i++ ; sum=sum+$10} END {print "状态码次数: "i "总计流量: "sum}' access.log
状态码次数: 4630总计流量: 1624526


其它写法
[root@m01 files]# awk '$9~/^[2345]/  {i++ ; sum+=$10} END {print "状态码次数: "i "总计流量: "sum}' access.log
状态码次数: 166943总计流量: 2478496663


sum=sum+$10
简写格式 sum+=$10


#03 写法2
#01 统计 /var/log/nginx/access.log  状态码200的次数和流量  总流量 4开头 总汇


1)统计所有状态码的 次数和流量 
[root@aliyun ~]# awk 'BEGIN{ print "总次数\t" "总流量\t"}   $9 ~/^[0-9]/ {i++;sum=sum+$10} END{print i,sum}' /var/log/nginx/access.log  | column -t
总次数  总流量
377     3221118

2)统计状态码2开头 的状态码次数和 流量
[root@aliyun ~]# awk 'BEGIN{ print "2xx\t" "流量\t"}   $9 ~/^2/ {i++;sum=sum+$10} END{print i,sum}' /var/log/nginx/access.log  | column -t
2xx  流量
120  2969594


3)统计状态码3开头 的状态码 次数和流量
[root@aliyun ~]# awk 'BEGIN{ print "2xx\t" "流量\t"}   $9 ~/^3/ {i++;sum=sum+$10} END{print i,sum}' /var/log/nginx/access.log  | column -t
3xx  流量
27   135



4)统计状态码4开头 的状态码 次数和流量
[root@aliyun ~]# awk 'BEGIN{ print "2xx\t" "流量\t"}   $9 ~/^4/ {i++;sum=sum+$10} END{print i,sum}' /var/log/nginx/access.log  | column -t
4xx  流量
27   135


4)汇总要求分别打印所有 状态码(2系列,3系列,4系列)次数和流量 并打印标题
[root@aliyun ~]# awk  ' BEGIN {print "状态码\t" "次数\t" "流量\t"}   $9 ~ /^[0-9]/ {x++;y=y+$10}; $9 ~ /^2/ {x2++;y2=y2+$10}; $9 ~ /^3/ {x3++;y3=y3+$10} ;$9 ~ /^4/ {x4++;y4=y4+$10}  END{print  "2xx \t",x2,y2; print "3xx\t",x3,y3;print "4xx\t",x4,y4; print "all\t",x,y}'  /var/log/nginx/access.log | column -t
状态码  次数  流量
2xx     120   2969594
3xx     27    135
4xx     223   251552
all     380   3221281



提示:使用这个 ; 符号 执行多次命令 


[root@aliyun day07]#  cat 01-awk
BEGIN {
		print "状态码\t" "次数\t" "流量\t"
		}   
$9 ~ /^[0-9]/ {
			x++
			y=y+$10}

$9 ~ /^2/ {
		x2++
		y2=y2+$10}

$9 ~ /^3/ {
		x3++
		y3=y3+$10}

$9 ~ /^4/ {
		x4++
		y4=y4+$10} 

END { 
				print  "2xx \t",x2,y2
				print "3xx\t",x3,y3
				print "4xx\t",x4,y4
				print "all\t",x,y
				}



[root@aliyun day07]# awk -f 01-awk  /var/log/nginx/access.log  | column -t
状态码  出现次数    流量
2xx     36        734747
3xx     13        65
4xx     22        6508
all     71        741320

解释下:脚本转换 把;符号 换成回车
			 使用 -f 指定


2.3 数组

使用awk数组

  • awk数组赋值
  • awk数组取值
  • awk数组批量取值
# 语法格式
q[1]="zhang"
q 数组名称
[1] 索引 下标
"zhang" 内容


#01  给x赋予值 zhangyuzhou  zhangbingbing
[root@aliyun ~]# awk 'BEGIN{x[1]="zhangyuzhou";x[2]="zhangbingbing"; print x[1],x[2]  }'
zhangyuzhou zhangbingbing

解释下:
			x[1]="zhangyuzhou"     x数组内 索引1位置 加入值 zhangyuzhou
			x[2]="zhangbingbing"   x数组内 索引2位置 加入值 zhangbingbing


#02 取出IP出现的次数 和 流量总和
#分析动作
	需要 ip  流量  ($1 $10)
	ip地址设置为 数组, 流量设置为 下标内容
	结构

[root@aliyun ~]# awk '{x[$1]=x[$1]+$10} END{for (ip in x)print  ip,x[ip]}'  /var/log/nginx/access.log  | head
91.240.118.187 0
47.92.71.160 54300
20.55.53.144 27150
8.222.203.92 10
117.187.173.88 27150
91.224.92.16 10
87.251.64.11 0
84.54.51.12 157
23.234.211.136 0
45.43.33.218 27150
	
	
	
解释下 待补充:
	
 'BEGIN{x[1]="zhangyuzhou";x[2]="zhangbingbing"; print x[1],x[2]  }'
 
	for i in  x
	第一次循环 
    x = 91.240.118.187
    i = x = 91.240.118.187




x[10.0.0.01]   1000       x[10.0.0.01]-->>1000
x[10.0.0.01]   3344 			x[10.0.0.01]-->>4344 


#03  取出/etc/password 中每种 shell 出现的次数 (数组方式)
[root@aliyun ~]# awk -F':'  'BEGIN {print "shell名称\t","次数\t"} $NF ~/^\// {q[$NF]++} END{ for (i in q) print i,q[i] }'   /etc/passwd  |column -t | sort  -n -k2
shell名称       次数
/bin/sync       1
/sbi            1
/sbin/halt      1
/sbin/shutdown  1
/sbin/no        2
/bin/bash       8
/sbin/nologin   23


解释下: 
				q[$NF]++} 			shell 每出现一次 保存在数组里 
				for (i in q)    循环取出。   
				i								i=q =$NF 
				q[i]						q[i] =q[$NF] = 出现的次数
		
      q[$NF]++
      q[/sbin/nologin]+1 1
      q[/bin/sync]+1     1
      q[/sbin/nologin]+1 2  
      q[/bin/bash]			 1
      q[/sbin/nologin]+1 3 
      q[/bin/sync]+1     2

       for (
        i in q)

      第一次
      i=q = /sbin/nologin

      第二次
      i=q = /bin/sync

      第三次 
      i=q =  /bin/bash

       print i,q[i]

      q[i]  = q[/bin/sync] =  2


#04 找出/opt/day07/13.txt 登入最多的IP 
cat <<EOT >/opt/day07/13.txt
219.217.49.14
175.43.4.87
87.48.98.1
59.73.38.25
219.217.50.14
59.92.48.32
219.217.49.14
59.72.38.142
59.73.38.25
219.217.49.14
219.217.50.14
59.92.48.32
219.217.49.14
59.72.38.142
59.73.38.25
219.217.49.14
59.92.48.32
EOT


[root@aliyun ~]# cat /opt/day07/13.txt | awk '{y[$1]++} END {for (i in y) print i,y[i] }' | column -t | sort | sort -k 2 -nr
219.217.49.14  5
59.92.48.32    3
59.73.38.25    3
59.72.38.142   2
219.217.50.14  2
87.48.98.1     1
175.43.4.87    1



#17 # 腾讯一 shell 试题.
假设 qq.tel 文件内容:
12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544

要求分类如下:
[12334]
13510014336
12343453453
...........
[12099]
13598989899
............

#05 开始写题
[root@aliyun day08]# awk -F':' '{y[$1]=y[$1]"\n"$2} END{for (i in y) print "["i"]",y[i] }' 17
[12099]
13598989899
12343454544
[12334]
13510014336
12343453453
12345454545
[12345]
12334555666

		解释下:
		要求: 把标题一致的内容统一放置
          分析动作
          # 动作
          保存相同后面标题内容  y[$1]=arr[$1]"\n"$2           
          # 解释下 数组y[相同索引$1]索引内容 追加

		

##18 数据处理题目
文件:text.txt 格式:
web01[192.168.2.100]
httpd ok
tomcat ok
sendmail ok
web02[192.168.2.101]
httpd ok
postfix ok
web03[192.168.2.102]
mysqld okif ()
httpd ok
需要通过 awk 将输出格式变成:
web01[192.168.2.100]: httpd ok
web01[192.168.2.100]: tomcat ok
web01[192.168.2.100]: sendmail ok
web02[192.168.2.101]: httpd ok
web02[192.168.2.101]: postfix ok
web03[192.168.2.102]: mysqld ok
web03[192.168.2.102]: httpd ok


[root@aliyun day08]# awk '{if ('/^web/') {y=$0} else {x=$0 ;print y": "x}}' 18
web01[192.168.2.100]: httpd ok
web01[192.168.2.100]: tomcat ok
web01[192.168.2.100]: sendmail ok
web02[192.168.2.101]: httpd ok
web02[192.168.2.101]: postfix ok
web03[192.168.2.102]: mysqld ok
web03[192.168.2.102]: httpd ok

	解释下:
			{if 
					('/^web/') 				判断以 web开头的
						{y=$0} 					条件成立则 赋值给 y =  web01[192.168.2.100]..web02[192.168.2.101]
			else 									
				{x=$0 							条件不成立 则赋值给 x  = httpd ok  tomcat ok...
				
				print y": "x}}'

2.4 判断

# 语法格式
1)双分支格式
{ if (判断条件) { 如果成立后的动作 } else {否则 怎么样} } END {  执行完后的动作  }

2) 多分支格式
{ if (判断条件) { 如果成立后的动作 } else if (判断条件) {成立的动作}  else {否则 怎么样} } END {  执行完后的动作  }




  • 案例

#01 取出磁盘可用百分比 超过百分之50 打印“磁盘快满了” 否则显示 一切正常
[root@aliyun ~]# df -h  | awk -F'[ %]+'  'NR>1 {if ($5<60) {print "一切正常 磁盘空间目前可用是: ",$5} else {print "磁盘快 满了 请及时处理"} }'
一切正常 磁盘空间目前可用是:  0
一切正常 磁盘空间目前可用是:  0
一切正常 磁盘空间目前可用是:  1
一切正常 磁盘空间目前可用是:  0
一切正常 磁盘空间目前可用是:  52
一切正常 磁盘空间目前可用是:  0


解释:
		{if 									#判断
			($5<60)							#第五列小于 60的
    		{print "一切正常 磁盘空间目前可用是: ",$5} 		#条件为真 执行的动作
    else 																					 #否则 执行的动作 
    		{print "磁盘快 满了 请及时处理"} 
				}


#02 取出2xx 3xx 状态码次数和流量 并且显示其它的次数和流量
[root@aliyun ~]# awk '{if ($9 ~/^2/) {x2++;y2=y2+$10} else if ($9 ~/^3/) {x3++;y3+=$10} else {x4++;y4+=$10} } END{print "2xx",x2,y2;print "3xx",x3,y3;print "all",x4,y4}' /var/log/nginx/access.log、
2xx 124 3023904
3xx 30 150
all 255 255290





2.5 循环

# 语法结构
# awk数组专用 for循环
for(ip  in h)
   print ip,h[ip]
   
#awk 通用for循环 c语言循环
for(i=1;i<=10;i++)
   print i


##基本语法
[root@aliyun ~]# awk 'BEGIN {for (i=1;i<=5;i++) print i}'
1
2
3
4
5

	解释下:
				{for 
					(i=1			循环初始值  
					i<=5			循环到结束值。当i 小于或者等于5时候 结束循环
					i++)			每循环一次 i 自增1         
          print i}	打印i的值 
				
			

#01 计算 从1加到100
[root@aliyun ~]# awk 'BEGIN {for (i=1;i<=100;i++) sum=sum+i;print sum}'
5050

解释下:

		for (i=1;i<=100;i++) 		从1开始循环到100
			sum=sum+i							sum等于 变量i的值。相加的和  1+2+3+4....+100 (从1开始循环到100)
			print sum							最后打印出来 sum 结果




二. sort uniq 排序去重

2.1 基本用法

sort	 排序			
				-t: 指定字段分隔符				
				-k:  指定要对第几列排序			
				-n:  以Number的方式排序
				-r:  默认从小到大, -r 从大到小
				-h: 以人类可读的方式排序

2.2 对于用户id 排序

#01 排序
[root@aliyun ~]# cat /etc/passwd | awk -F':'  '{print $3,$4}' | sort -k 1  -n
0 0
1 1
2 2
3 4
4 7
5 0
6 0
7 0
8 12
11 0
12 100
14 50
16 16
28 28
32 32
38 38
55 55
59 59

2.3 取出访问IP top前十

[root@aliyun nginx]# cat access.log | awk '{print $1}' | sort -nr | uniq  -c | sort -k 1 -nr | head -10
     69 47.92.30.214
     24 47.92.70.66
     24 172.26.138.198
     22 47.92.32.64
     18 47.92.67.105
     15 8.142.104.65
     12 8.142.87.162
     12 47.92.79.86
     12 223.111.175.3
     11 47.92.73.218
     
解释下:
				uniq  -c  去重 并且显示次数
				sort -nr  以数字的方式进行排序 


2.4 取出访问日志 状态码

#01 取出状态码
[root@aliyun nginx]# awk '$9 ~/^[0-9]/ {print $9}' access.log | sort -nr | uniq -c  | sort -k 1 -nr | head -5
    340 200
    196 404
     62 301
     24 157
     15 400
     
 解释下:	
 			'$9 ~/^[0-9]/ {print $9}'		过滤第九行 以数字开头'^[0-9]' 并打印第9列 
 			
 			

三. grep 过滤

3.1 基本用法

		grep    过滤	
            -r  递归查询
            ^   以什么开头					 
            $   以什么结尾					 
            -v  取反,排除      可以使用 grep -vn '^$' 排除空行显示					 
            -E  扩展正则; 匹配多个 (或者使用:egrep)					
            -n  显示行号					
            -i  忽略大小写	
            -o  只显示匹配的内容
            -A  向下打印行数 				
            -B  向上打印行数
            -C 向下和向下打印行数 (例如:-A2 向下打印2行)
            -w  精准过滤
            -l  过滤单个或者多个文件时 只显示文件名称,不显示内容
            -h  过滤单个或者多个文件时 只显示文件内容,不显示名称
            -R  递归过滤,寻找目录及子目录的所有文件内容
            -P  支持perl 语言正则
            -m  按行匹配 例如; m2 只匹配两行
            -c	小写的  显示匹配的行数; 可以在过滤时候排除自己 例如ps -ef | grep -c '[c]rond'
            -q  安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。

3.2 简单使用

#01 过滤包含root的行
[root@aliyun etc]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#02 过滤 以root开头的行
[root@aliyun etc]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

#03 过滤 以bash结尾的行
[root@aliyun etc]# grep  -n 'bash$' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
25:zhangyuzhou:x:1000:1002::/home/zhangyuzhou:/bin/bash
35:zhangbingbing:x:1001:1001::/home/zhangbingbing:/bin/bash
36:zhang:x:1002:1009::/home/zhang:/bin/bash
37:zhangbing:x:1003:1003::/home/zhangbing:/bin/bash
38:zhangbingbing1:x:1004:1010::/home/zhangbingbing1:/bin/bash
39:zhangbingbing2:x:1005:1011::/home/zhangbingbing2:/bin/bash
40:zhangbingbing3:x:1006:1006::/home/zhangbingbing3:/bin/bash

3.3 排除 取反 多个

#01 排除 bash 和nologin 结尾的所有行 并显示行号 打印出来
[root@aliyun ~]# grep -E  -vn  'bash$|nologin$' /etc/passwd
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
28:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/no
29:libstoragemgmt:x:997:995:daemon account for libstora
30:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbi
31:oprofile:x:16:16:Special user account to be used by gin
34:nginx:x:994:991:nginx user:/var/cache/nginx:/sbin/no


解释下:
	'bash$|nologin$'    | 代表 并且的意思
   -v									 排除
   -n									 显示行号
	


3.4 打印指定行

#01 打印前十行
[root@aliyun ~]# grep -n -A9 '^root'  /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
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
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin

	解释下:
			先找到第一行的关键词 匹配到第一行 
			使用 -A 参数 向下打印9行 

#02 打印 上下一行
[root@aliyun ~]# grep -n -C1 '/var/adm'  /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

#03 打印下一行 上两行
[root@aliyun ~]# grep -n -A1 -B2 '/var/adm'  /etc/passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
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

3.5 排除空行和注释行

#01 排除空行和注释行
[root@aliyun ssh]# grep -E  -v '^#|^$' sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
AuthorizedKeysFile	.ssh/authorized_keys
ChallengeResponseAuthentication no
GSSAPIAuthentication yes

解释下:
	^#		注释行,以#开头
	^$    空行
	

3.6 配合正则

## 案例
金 211324198705244720
万 500224197105168312
任 1231231231zhangyuzhou
任 3zhangyuzhou
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
取出文件中正确的身份证号码的行

提示:身份证是 17数字+x 或者 17数字


#01 取出正确身份证
[root@aliyun day05]# egrep '[0-9]{18}|[0-9]{17}X'   04.txt
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X

解释下:
		[0-9]{18}|[0-9]{17}X  
		[0-9]		代表数字
		{18}		18位数字
		
		身份证是18位数字或者17位数字+X 
		

#02 案例2 取出IP地址
1) 方式1
[root@aliyun ~]# ip a s eth0 | egrep -o '[0-9][0-9][0-9].[0-9][0-9].[0-9][0-9][0-9].[0-9][0-9]8' 
172.26.138.198
2) 方式2
[root@aliyun ~]# ip a s eth0 | egrep -o '[0-9]{3}.[0-9]{2}.[0-9]{3}.[0-9]{2}8' 
172.26.138.198




四. sed 替换

4.1 基本用法

		sed     替换  
				-n: 取消默认输出 用于取行,  '2P' 
				
                (例:[root@localhost ~]# sed -n '2,5p' /etc/passwd,只打印出2-5行的内容
				      sed '1~2p'打印出从1开始,每次加2,的所有行行数,取奇数行
					 [root@localhost /]# sed -n '/5/Ip' /file   过滤出包含5的行,I,忽略大小写 
					 
				-r: 扩展正则				
				-i: 更改数据			
			    例:sed  's#/(^.*)(.*)(.*$)#\#g'   ''中的字母,command命令
				
				.  代表任意单个字符
				*  多次重复前面字符
				^  从首部开始
				$  尾部
				() 分组
				/  转义符号,回归原有属性,比如:需要在正侧里显示括号,可以使用转义符号
				例如 [root@localhost /]# stat /etc/passwd | sed -n '4p' | sed -r 's#.*\((.*)/-.*#\1#g'
				     在正侧里回归括号本身的属性
				\ 调用分组中某个()中的数据
				s: 替换
				g: 全局
				p: 打印
				d: 删除某一行  ( 例: sed '2,5d' ,删除2-5行)	
				
				# sed -n '$p' /etc/passwd 取最后一行 
				'$p' 表示最后一行,'/$1/p' 如果有斜线保护 侧是以什么什么结尾 
				&  表示匹配的所有内容 例如 sed 's#.*#&#g' 这里面 & 表示 前面的 .*  数据
				
				nginx -V  2>/dev/stdout| sed -n '/configure/s# #\n#gp' 搜索的正确输入 空格替换回车


4.2 打印和删除 指定行

  • -n 执行删除操作时候 需要去除该参数
#01 打印2-5
[root@aliyun ~]# cat -n /etc/passwd |sed -n  '2,5p'
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     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

解释下:
			-n  取消默认输出 用于取行 
			2,5 第二行到第五行
			p		打印
		
		总汇:打印 2-5行 /etc/passwd
		
#02 取最后一行
[root@aliyun ~]# cat /etc/passwd  -n |  sed -n '$p'
    40	zhangbingbing3:x:1006:1006::/home/zhangbingbing3:/bin/bash
    
    解释:$p 代表最后一行
 
 
#03 打印单行
[root@aliyun opt]# cat -n /opt/passwd |  sed  -n  '5p'
     5	daemon:x:2:2:daemon:/sbin:/sbin/nologin

#04 删除2-6行
[root@aliyun opt]# sed -i   '2,6d' /opt/passwd
		
		解释下:
					d  删除
					-i 修改文件 


#04 打印指定行的 后行
[root@aliyun opt]# sed  -rn  '/^zhangyuzhou/,+5p' passwd
zhangyuzhou:x:1000:1002::/home/zhangyuzhou:/bin/bash
tss:x:59:59:Account used by the trousers package to in/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/no
libstoragemgmt:x:997:995:daemon account for libstora
pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbi


   解释下:过滤zzhangyuzhou 开头的行 并且向下打印5行
   				
   				+5p 向下打印5行

#05 打印偶数行和奇数行
[root@aliyun opt]# seq 10 | sed -n '1~2p'
1
3
5
7
9
[root@aliyun opt]# seq 10 | sed -n '0~2p'
2
4
6
8
10


  解释下
  0~2p
  从0开始每次加2 



4.3 替换文件内容

#01 替换root 为zhangbingbing
[root@aliyun ~]# sed 's#root#zhangbingbing#g'  /etc/passwd

	解释下:
				s#root#zhangbingbing#g:  
				语法解释-- s#找谁#替换谁#g
				
				g 代表全局替换 否则只会替换每行的第一个 

#02 指定行数
[root@aliyun ~]# sed  -r '3s#448#558#g'  /opt/day08/file.txt 
my qq num is 49000448.$

not 4900000558.
my god ,i am not oldby,but clsn!$
my god ,i am 000 oldboy,but clsn!$


	解释下:
		3s#448#558#g		3s 代表替换第三行
        
        



4.4 过滤 取反

注意: sed默认输出显示文件内容 可以使用 -n 取消默认输出

#01 sed 匹配多个 
[root@aliyun opt]# sed  -n  -r '/^zhangbingbing|bash$/p' /opt/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
zhangyuzhou:x:1000:1002::/home/zhangyuzhou:/bin/bash
zhangbingbing:x:1001:1001::/home/zhangbingbing:/bin/bash
zhang:x:1002:1009::/home/zhang:/bin/bash
zhangbing:x:1003:1003::/home/zhangbing:/bin/bash
zhangbingbing1:x:1004:1010::/home/zhangbingbing1:/bin/bash
zhangbingbing2:x:1005:1011::/home/zhangbingbing2:/bin/bash
zhangbingbing3:x:1006:1006::/home/zhangbingbing3:/bin/bash

  解释下:
  			/^zhangbingbing|bash$/p  匹配以zhangbingbing开头和 bash结尾的行 全部打印出来
  			p		打印
  			


#02  从103开始匹配 到119结束
[root@m01 files]# sed -n  '/103/,/119/p' sed.txt 
103,张宇宙996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
119,huiling,CFO


		解释下: sed -n '/从那里开始/,/到那里结束/'
					  只适用于第一列 且是数字


#03 取反
[root@aliyun opt]# sed -rn  '/^zhang/!p'   passwd

	解释下:排除 zhang开头的行 显示其它的全部 
	
					!p 取反


4.5 增加内容

#01 在最后一行增加 zhangbingbing momo 
[root@aliyun day05]# sed -r '$a zhangbingbing momo ' 02.txt
103,张宇宙996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
119,huiling,CFO
zhangbingbing momo


#02 在最后一行增加多行
[root@aliyun day05]# sed -r '$a zhangbingbing momo\n1\n232 ' 02.txt
103,张宇宙996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
119,huiling,CFO
zhangbingbing momo
1
232

		解释下:
				$a 代表最后一行
				\n 换行符
	
		

4.6 后向引用

#01 替换文件内的所有数字 为 66
[root@aliyun day05]# sed  -r  's#[0-9]#66#g' 01.txt
<6666><6666><6666>,zhangyuzhou,CEO
<6666><6666><6666>,zhangya,CTO
<6666><6666><6666>,<6666><6666><6666>,COO
<6666><6666><6666>,yy,CFO
<6666><6666><6666>,feixue,CIO
<6666><6666><6666>,lidao,COCO
<6666><6666><6666>,huiling,CFO

	解释下:
			's#[0-9]#66#g'		
			[0-9]						代表数字
			[a-z]						小写字母
			[A-Z]						大写字母
			[a-Z]						大小写字母
			66							每个数字替换的内容
			


#02 匹配指定字符 并加 <> 括起来
[root@aliyun day05]# echo {1..4}{a..e} | sed -r 's#([0-9][a-z])#<\1>#g'
<1a> <1b> <1c> <1d> <1e> <2a> <2b> <2c> <2d> <2e> <3a> <3b> <3c> <3d> <3e> <4a> <4b> <4c> <4d> <4e>
	
	解释下:
		's#([0-9][a-z])#<\1>#g'
		([0-9][a-z])  匹配 数字和字母
		\1						后向引用
		

#03 取出系统用户和使用的 bash
[root@aliyun ~]# sed -r 's#(.*):x.*:(.*)#\1,\2#g' /etc/passwd
oprofile,Special user account to be used by gin
ntp,/sbin/nologin
mysql,/sbin/nologin
nginx,/sbin/no
zhangbingbing,/bin/bash
zhang,/bin/bash
zhangbing,/bin/bash
zhangbingbing1,/bin/bash
zhangbingbing2,/bin/bash
zhangbingbing3,/bin/bash

#04 取出 IP地址
[root@aliyun ~]# ip a s eth0 | sed  -rn  '3p'
    inet 172.26.138.198/20 brd 172.26.143.255 scope global dynamic eth0
[root@aliyun ~]# ip a s eth0 | sed  -rn  '3p' | sed  -r  's#.*t (.*)/.*#\1#g'
172.26.138.198
		
		解释下:
			's#.*t (.*)/.*#\1#g'
			.*t 	匹配到t 停止匹配
			/.*		从/ 开始匹配后面的所有
			


#05 取出文件权限
[root@aliyun ~]#  stat /etc/passwd  | sed  -n  '4p'
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
[root@aliyun ~]#  stat /etc/passwd  | sed  -n  '4p' | sed -r 's#.*\((.*)/-.*#\1#g'
0644
			
		解释下:
			's#.*\((.*)/-.*#\1#g' 
			/ 转义符号
			匹配以( 开始的内容 并以 /- 结束
		
		

五. find 查找

5.1 基础用法

       find     查找文件		
       
		         -type   基于类型;f d s c b l     (例:#  find /path  -type  f)
		         					f 文件类型
		         					d 目录类型
		         					
		         					
		         					
		         -name   基于名称
				 
				 		 -iname 	忽略大小写
				 		 
				 			
			     mtime   基于时间,文件修改时间			 
				         +7: 7天以前   ( 保留最近7天的数据 ,一般用于备份,仅保留最近7天数据)
			           -7: 最近7天 	
                 
           ctime   显示文件属性修改时间		
           atime   文件访问时间
           
					 perm    基于权限 (例如 -perm 644 ,只找出权限644,)
					 
					 或者,-perm /u+r 属主有读权限,/g+r df 属组有读权限,/+r 有读权限的都找出来		
           
				   
				   -maxdepth 最大深度,最多查找几层内容		  
				 
				    user     基于用户    onuser
            group    基于用户组  ongroup 
					
					
             -a     与  并且 
             -o     或  或者 (可以配合括号,ind /root/dir1 \( -name "file5" -o -name "file9" \) 或者关系)
                    -not|!  非 
			
						  
				
				动作, 
				      ok:    提示
			         -exec   后面跟自定义 shell 命令(标准写法 -exec {} \;   使用xargs 替代; 将所有的结果打包一起直接作为参数传递;逐条执行
							 例如 : find /home/test/ -type f -name "*.log*" -mtime +5  -exec  rm -rf {} \;
					 -exec 	 格式 -exec {} + (把结果一起合并处理,主要用于打包压缩这方面)	 
					 -print:  默认;
			         -ls:     可以使用xargs ls -l 替代
                     -delete  删除查找到的文件(仅能删除空目录) 

				例:  [root@oldboyedu ~]# find ./ -type f -name "file-*" -mtime +7 \
				
		dirname    /etc/passwd 取目录部分 (可以配合find 使用 排序 去重 前5) 
		basename   /etc/passwd 取文件名
		        				

5.2 查找文件

#01 查看指定名称的文件 以conf 结尾的
[root@aliyun etc]# find /etc/*  -type f -name "*conf"
/etc/tuned/tuned-main.conf
/etc/udev/udev.conf
/etc/updatedb.conf
/etc/usb_modeswitch.conf
/etc/vconsole.conf
/etc/wpa_supplicant/wpa_supplicant.conf
/etc/wvdial.conf
/etc/yum/version-groups.conf
/etc/yum/protected.d/systemd.conf
/etc/yum/pluginconf.d/langpacks.conf
/etc/yum/pluginconf.d/fastestmirror.conf


#02 找出/var/目录下 30天之前的 所有以 .log结尾的文件 
[root@aliyun var]# ll   `find ./* -type f -iname "*.log" -mtime +30`
-rw-------. 1 root root      0 3月  18 2021 ./log/anaconda/storage.log
-rw-------  1 root root      0 12月 31 2021 ./log/boot.log
-rw-r--r--  1 root root      0 3月  18 2021 ./log/cloudinit-deploy.log
-rw-r--r--  1 root adm  100738 12月 30 2021 ./log/cloud-init.log
-rw-r--r--  1 root root   4689 12月 30 2021 ./log/cloud-init-output.log
-rw-r--r--  1 root root    366 12月 30 2021 ./log/ecs_network_optimization.log
-rw-r--r--  1 root root   1301 12月 30 2021 ./log/tuned/tuned.log

	解释下:
			-mtime +30   代表文件修改时间 30天之前的



#03 找出/var/下面 所有以log结尾 并且30天之前 并且 (文件名以 program开头 或者 cloud-init开头的)所有文件 
[root@aliyun var]#  ll  `find ./* -type f -iname "*.log" -mtime +30  -a  \( -name "program*" -o -name "cloud-init*" \) `
-rw-------  1 root root   5406 12月  5 2020 ./lib/docker/overlay2/22972c932ed84fd81659df913f5129c47cc6ba78dafcda0459e8e44cffcc9951/diff/var/log/anaconda/program.log
-rw-------. 1 root root      0 3月  18 2021 ./log/anaconda/program.log
-rw-r--r--  1 root adm  100738 12月 30 2021 ./log/cloud-init.log
-rw-r--r--  1 root root   4689 12月 30 2021 ./log/cloud-init-output.log


	解释下:
				-a		并且
				-o		或者 或者关系需要 ()括起来
				



六 时间管理 date

6.1 基础用法

		date
				  +%F #Y年-m月-d日 ,2021-03-14 %Y-%m-%d
				  +%T #H时-M分-S秒  %H:%M:%S
				  +%w # 周
				  +%s # 获取秒
				  -d 根据指定描述 显示日期时间([root@localhost ~]# date -d 19990306 +%F ,可以配合其它选项使用)
				      date -d '-1day'  显示昨天日期(可加可减)
				  -s 修改系统时间 date -S  "2016-11-11 00:00:00"
				  date +"%F%T"

6.2 显示时间

#01 显示年月日
[root@master01 ~]# date  '+%Y-%m-%d %T'
2023-07-23 20:18:45
[root@master01 ~]# date  +%Y-%m-%d_%T
2023-07-23_20:18:53

#02 显示时分秒
[root@master01 ~]# date  +%T
20:19:29
[root@master01 ~]# date  +%H:%M:%S
20:19:45


#03 显示周
[root@master01 ~]# date +%W
29

	解释下: 当前年的第多少周


#04 显示指定时间
[root@master01 ~]# date -d 19961225
1996年 12月 25日 星期三 00:00:00 CST

[root@master01 ~]#  date -d "1996-12-25 23:30:00"
1996年 12月 25日 星期三 23:30:00 CST

	解释下:
		显示指定时间:1996 12 25  

#05 时间加减法
[root@master01 ~]# date  -d '2day'
2023年 07月 25日 星期二 20:26:12 CST
[root@master01 ~]# date  -d '-2day'
2023年 07月 21日 星期五 20:27:25 CST

	解释下:
			默认是加  -d '2day'    当前时间加两天
					-d '-2day'   当前时间减两天


6.3 修改时间

#01 修改时间
[root@master01 ~]# date -s "1996-12-25 23:30:00"
1996年 12月 25日 星期三 23:30:00 CST

[root@master01 ~]# date +%F_%T
1996-12-25_23:30:23

6.4 校验时间 ntpdate

#01 NTP时间服务 自动校正时间
[root@master01 ~]# yum install -y ntpdate

#02 时间同步
[root@master01 ~]# ntpdate ntp1.aliyun.com
23 Jul 16:14:38 ntpdate[3434]: step time server 120.25.115.20 offset -19054.680538 sec



七. 压缩三剑客

7.1 基础用法

		gzip    打包,只针对文件,后缀加 *
		       
				-d    解压 
		
         zcat  不解压,查看内容  zcat  /etc/yum.repos.d/CentOS-Debuginfo.repo.gz
        
	    zip(常用)     命令可以对文件进行压缩打包,需要安装(yum install zip unzip -y)
		        -r  递归压缩文件、目录   [root@localhost ~]# zip -r 需要解压的路径名称.zip  打包文件路径
				-p  不显示打包过程
	     		-T  查看压缩包是否完整  
		
        unzip   解压 ,默认解压到当前目录  (格式:zip -r  dir.zip  路径dir/)
		         -l  不解压压缩,查看压缩包内容
				 -t  查看压缩包内容 ok 就是正常的
				 -d   /opt, 解压到指定目录 (格式 unzip filename.zip  -d /opt/ )

		tar      是linux下最常用的压缩与解压缩, 支持文件和目录的压缩归档
					
					tf      #查看压缩包内容
					xf      #自动选择解压模式 ,智能

                 	czf     #打包tar.gz格式	
					cjf     #打包tar.bz格式
					cJf     #打包tar.xz格式
					
				 c   #创建新的归档文件
				 x   #对归档文件解包
				 v   #输出命令的归档或解包的过程
                 t   #列出归档文件里的文件列表
				 f   #指定包文件名,多参数f写最后

                 z   #使用gzip压缩归档后的文件(.tar.gz)
				 j   #使用bzip2压缩归档后的文件(.tar.bz2)
                 J   #使用xz压缩归档后的文件(tar.xz)
				 C   #指定解压目录位置
			     X   #排除多个文件(写入需要排除的文件名称)
				 h   #打包软链接
				--hard-dereference  #打包硬链接
				--exclude   #在打包的时候写入需要排除文件或目录  
				
				(例,排除单个文件,[root@xuliangwei /]#  tar czf etc.tar.gz --exclude=etc/services etc/)
				(例,排除多个文件,[root@xuliangwei /]# tar czf etc.tar.gz --exclude=etc/services --exclude=etc/rc.local etc/)
				[root@xuliangwei /]# tar czfX etc.tar.gz   #paichu.list,需要排除的文件写进去#   etc/


7.2 gzip

## gzip 压缩只能针对文件 并且原文件会变成压缩包 并不会保留 
## 优点 压缩比例高 
 
#01 压缩.conf结尾的文件
[root@master01 day11]# gzip *.conf


#02 解压
[root@master01 day11]# gzip  -d *


#03 查看压缩后大小
1)压缩前大小
[root@master01 day11]# ll |   awk '{x=x+$5} END {print x}'
249011

2)压缩后大小
[root@master01 day11]# ll |   awk '{x=x+$5} END {print x}'
84066


#04 不解压查看压缩包内容
[root@master01 day11]# zcat  /etc/yum.repos.d/CentOS-Debuginfo.repo.gz
[base-debuginfo]
name=CentOS-7 - Debuginfo
baseurl=http://debuginfo.centos.org/7/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
enabled=0


7.3 zip

  	    zip(常用)     命令可以对文件进行压缩打包,需要安装(yum install zip unzip -y)
  		        -r  递归压缩文件、目录   [root@localhost ~]# zip -r 需要解压的路径名称.zip  打包文件路径
  				-p  不显示打包过程
  	     		-T  查看压缩包是否完整  
  	
  	    unzip   解压 ,默认解压到当前目录  (格式:zip -r  dir.zip  路径dir/)
  		         -l  不解压压缩,查看压缩包内容
  				 -t  查看压缩包内容 ok 就是正常的
  				 -d   /opt, 解压到指定目录 (格式 unzip filename.zip  -d /opt/ )
#01 需要下载 yum install -y unzip zip 
#可以打包文件和目录 和windows 通用 (源文件还存在)

  zip  压缩包名称和路径   需要压缩的目录或者文件
  	 
     -r 递归意思,压缩目录必用

#02 压缩目录 
[root@master01 opt]# zip -r  day11.zip  day11 


#03 压缩到指定目录
[root@master01 opt]#   zip -r  /opt/day`date +%F_%T`.zip  day11


#04 压缩文件
1)压缩
[root@master01 day11]# zip yum.conf.zip   yum.conf
2)检查
[root@master01 day11]# ll yum.conf*
-rw-r--r-- 1 root root 970 7月  23 20:51 yum.conf
-rw-r--r-- 1 root root 743 7月  23 21:16 yum.conf.zip


#04 解压目录和文件
1)解压文件
[root@master01 day11]# unzip yum.conf.zip

2)解压目录
[root@master01 opt]# unzip day11_bak.zip  

3)不解压查看内容
[root@master01 day11]# unzip -l ddddddddd.zip


4)不解压查看压缩包是否完整
[root@master01 opt]# unzip -t ddddddddd.zip
[root@master01 day11]# unzip -t yum.conf.zip 
Archive:  yum.conf.zip
    testing: yum.conf                 OK
No errors detected in compressed data of yum.conf.zip.


5)解压到指定目录
[root@master01 opt]# unzip -d /tmp/tets/   ddddddddd.zip
	解释下:解压到指定目录 /tmp/tets 
	

7.4 tar 经常用

  #语法格式
  tar  czf   /opt/test.tar.gz     /tmp/tets
  tar        压缩后的名称            压缩谁?


  tar      是linux下最常用的压缩与解压缩, 支持文件和目录的压缩归档
  
  				tf      #查看压缩包内容
  				xf      #自动选择解压模式 ,智能
  
               	czf     #打包tar.gz格式	
  				cjf     #打包tar.bz格式 # 都不用
  				cJf     #打包tar.xz格式 # 都不用
  
  			 c   #创建新的归档文件
  			 x   #对归档文件解包
  			 v   #输出命令的归档或解包的过程
               t   #列出归档文件里的文件列表
  			 f   #指定包文件名,多参数f写最后
  
               z   #使用gzip压缩归档后的文件(.tar.gz)
  			 j   #使用bzip2压缩归档后的文件(.tar.bz2)
               J   #使用xz压缩归档后的文件(tar.xz)
  			 C   #指定解压目录位置
  		     X   #排除多个文件(写入需要排除的文件名称)
  			 h   #打包软链接 
  			--hard-dereference  #打包硬链接
  			--exclude   #在打包的时候写入需要排除文件或目录  
#01 打包文件和目录
1)打包目录
[root@master01 opt]# tar czf etc.tar.gz etc/
[root@master01 opt]# ll
-rw-r--r--  1 root root 11382257 7月  23 23:12 etc.tar.gz

2)创建大文件 压缩文件
[root@master01 opt]# dd if=/dev/zero of=test bs=1000k count=100

[root@master01 opt]# tar czf test.tar.gz test
[root@master01 opt]# ll
总用量 109M
-rw-r--r--  1 root root  98M 7月  23 23:17 test
-rw-r--r--  1 root root  98K 7月  23 23:19 test.tar.gz

	

#02 查看压缩包内容
[root@master01 opt]# tar tf etc.tar.gz 



#03 解压
1)解压
[root@master01 opt]# tar xf etc.tar.gz 


2)解压到指定位置
[root@master01 opt]# tar xf etc.tar.gz -C /tmp/
[root@master01 opt]# ll /tmp/
总用量 20
drwxr-xr-x  89 root root 8192 7月  23 22:58 etc

解释下: 
		-C 指定解压位置


#04 打包时候排除文件
[root@master01 opt]# tar zcf etc-v2.tar.gz /etc  --exclude  /etc/vconsole.conf



7.5 exec 管道命令

-exec cmd {} ;

#01 基本用法
[root@master01 day11]# find /etc/* -type f  -name "*.conf"  -exec cp {} ./  \;

解释下:	
		把/etc/下面所有以 .conf结尾的文件 复制到当前目录

#02 /etc/下面面所有以 .conf结尾的文件 打包为压缩包 (zip)
[root@master01 opt]#  find /etc/* -type f  -name "*.conf" -exec zip bak.zip  {}  \;


7.6 xargs 管道命令

xargs       前者的结果 作为管道后者的参数
			-n 分组;
			-i {} 把前者的结果放入{}里 
#01 基本使用 复制文件
[root@master01 day11]# find /etc/* -type f  -name "*.conf" | xargs -i cp  {}  ./

解释下:	
		把/etc/下面所有以 .conf结尾的文件 复制到当前目录
		

#02 把/etc/下面面所有以 .conf结尾的文件 打包为压缩包 (zip)
[root@master01 opt]# find /etc/* -type f  -name "*.conf" | xargs -i zip  q.zip  {} 

		解释下: 
				等同于:zip  q.zip $(find /etc/* -type f  -name "*.conf")
				

#03  把/var/log 下面面所有以 .log结尾的文件  并且是 3天前 打包为压缩包 (tar.gz)
[root@master01 ~]# find /var/log/* -type f -name "*.log" -mtime +3 | xargs -i tar zcf  /backer/log_`date +%F_%T`.tar.gz  {}