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. 进行统计或者计算
标签:log,etc,命令,awk,aliyun,linux,print,root,三剑客
From: https://www.cnblogs.com/saas-open/p/17580017.html
相关文章
|