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你可以掌握: ...
随机推荐
- 学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
学科知识图谱学习平台项目 :技术栈Java.Neo4j.MySQL等超详细教学 0.效果展示 1.安装教程 安装Java SDK 11,下载前需要登录Oracle账号,下载链接,安装教程,测试是否能在 ...
- Python Selenium 库使用技巧
Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE,Mozilla Firefox,Safari,Google ...
- Webpack基础学习(一) (未完结)
一.Webpack介绍与基本使用 1.1.Webpack是什么? Webpack 是一个静态资源打包工具. 它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去. ...
- windows10 安装运行docker
windows10 安装使用docker part01.windows设置 启用windows 虚拟化 任务管理器-性能-CPU-虚拟化启用 启用Hyper-v 控制面板(Win+R -> 输入 ...
- 教你用CSS实现表单部件
案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用CSS编程实战案例,使用 列表标签完成一个下拉菜单样式的表单部件. 案例演示 运行代码后在浏览器弹出由 标签组成的下拉菜单样 ...
- FDConnection的事务测试讲解。。
总之用事务的宗旨是: 1.不用嵌套事务EnableNested设置为False 2.事务一定要回滚,避免发生异常的情况下,没有回滚 造成,不可估量的错误. try frmClientDm.MyMain ...
- 2021 ASP.NET Core 开发者路线图
GitHub地址:https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md
- Linux防火墙操作命令(开放或关闭端口)
在外部访问CentOS中部署应用时,需要通过防火墙管理软件,开端口,或者直接关闭防火墙进行解决(不建议) 常用命令:systemctl start firewalld #启 ...
- 迟来的HIT2024和realworld2024体验赛WP
目录 前言碎语 2024.2.14 中午 rwctf2024 体验赛 vision 哈工大青训营2024 结营赛 计算器 小技巧 神奇玩意 gdb! 再也不用苦哈哈往回翻 跟踪fork 赛后复现rw ...
- CF327C Magic Five 题解
题目传送门 前置知识 等比数列求和公式 | 乘法逆元 解法 设 \(lena\) 表示 \(a\) 的长度. 首先,若一个数能被 \(5\) 整除,则该数的末尾一定为 \(0\) 或 \(5\).故考 ...