linux 三剑客命令
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  {}
												
											linux 三剑客命令的更多相关文章
- 快速掌握Linux三剑客命令使用
		
前言 Linux三剑客指的是grep.sed以及awk命令的使用,这三个命令功能异常强大,大到没朋友.grep命令主打"查找",sed命令主打"编辑",awk命 ...
 - linux 三剑客命令(grep,sed ,awk)
		
grep 命令 :强大的文本’搜索’工具 1.grep -n 'word' file_name 在file_name文件中找到word所在的所有行并显示.-n 为显示行号. 2 ...
 - Linux三剑客命令使用(持续更新)
		
(本文档内容部分来源于网络) awk删除文件第一列 1.采用awk awk '{$1="";print $0}' file 2.采用sed sed -e 's/[^]* //' f ...
 - Linux常用基本命令:三剑客命令之-awk基础用法
		
awk是一个超级强大的文本格式化处理工具,他与grep, sed命令被成为linux 三剑客命令 三剑客命令的特点: grep:只要用来匹配和查找文本 sed: 编辑匹配到文本 awk: 格式化文本, ...
 - Linux实战教学笔记12:linux三剑客之sed命令精讲
		
第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...
 - Linux awk命令 --三剑客老大
		
Linux awk命令 --三剑客老大 基本用法: awk [参数] ['找谁{干啥}'] 文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...
 - day14 linux三剑客之sed命令
		
day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...
 - 快速上手Linux核心命令(五):文本处理三剑客
		
@ 目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 剑仙镇楼~ O(∩_∩)O 前言 上一篇中已经预告,我们这篇主要说Linux文本处理三剑客.他们分别是gre ...
 - Linux  基础命令
		
man 帮助命令 命令 --help 命令的简单帮助 help 命令的帮助(bash的内置命令) mkdir 创建目录 如makdir /data mkdir ...
 - Linux实战教学笔记18:linux三剑客之awk精讲
		
Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...
 
随机推荐
- TienChin 活动管理-活动导出
			
ActivityController /** * 导出活动列表 */ @PreAuthorize("hasPermission('tienchin:activity:export')&quo ...
 - 解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题
			
解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题 LLM(Large Language Model)通常拥有大量的先验知识,使得其在许多自然语言处理任务上都有着不错的性能 ...
 - 2.2 Windows驱动开发:内核自旋锁结构
			
提到自旋锁那就必须要说链表,在上一篇<内核中的链表与结构体>文章中简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解自旋锁的简单应用,自旋锁是为了 ...
 - Linux虚拟机追加扩展磁盘
			
一.使用VMware给虚拟机追加磁盘 使用VMware打开虚拟机设置对话框,选择硬盘,点击右侧的扩展按钮,输入扩展后的磁盘容量. 点击扩展按钮.提示磁盘已成功扩展. 二.对闲置的空间进行分区 上面扩展 ...
 - 官方实锤!AMD真的已经有了大小核:不搞Intel那一套
			
Intel 12代酷睿开始引入大小核混合架构,多核跑分提升立竿见影,在游戏.渲染等场景中也有很好的辅助作用,但因为大核心.小核心基于完全不同的架构,需要复杂的系统.软件调度配合,也直接导致失去了AVX ...
 - DevToys(开发工具) v1.0.2.1
			
从事开发工作的朋友们千万不要错过了!今天为大家带来的这款软件可以说是开发人员的必备工具,它就是DevToys软件!DevToys中包含了许多强大实用的开发工具,能够帮助用户将程序开发变得更加简单大大降 ...
 - golang 中 取切片元素 与 切片再生成切片的区别
			
func main() { //定义一个切片 a := []byte{1, 2, 3} fmt.Printf("a的类型%T\n", a) //a的类型[]uint8 fmt.Pr ...
 - [Java]HashMap与ConcurrentHashMap的一些总结
			
HashMap与ConcurrentHashMap的一些总结 HashMap底层数据结构 JDK7:数组+链表 JDK8:数组+链表+红黑树 JDK8中的HashMap什么时候将链表转为红黑树? 当发 ...
 - ES6学习 第三章 字符串的扩展
			
前言 本章主要是内容为是 ES6 对字符串的改造和增强. 本章记录字符串的扩展常用重点部分,不常用知识稍作记录. 本章原文链接: 字符串的扩展 模板字符串(template string) ES6字符 ...
 - NC19777 卡牌游戏
			
题目链接 题目 题目描述 小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而 ...