1.基础正则表达式
在linux中,
正则表达式用来匹配符合条件的字符串,支持的命令有grep,sed,awk
通配符用来匹配符合条件的文件名,支持的命令有ls ,find, cp等
基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或者任意多次 |
. | 匹配除了换行符外的任意一个字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配括号中的一个字符 |
[^] | 匹配除括号外的任意一个字符 |
\{n,m\} | 匹配前面的字符出现不少于n,不多m次的字符 |
\{n,\} | 匹配前面的字符出现次数不少n |
\{n\} | 前边的字符出现n次 |
测试
grep "a*" test
779 grep "aa*" test //匹配至少一个a的行
780 grep "aaa*" test //匹配至少2个a的行
781 grep "aaaaa*" test
782 grep "s..d" test //匹配s和d之间有两个任意字符的行
784 grep "s.*d" test //匹配s和d之间有任意多个字符的行
786 grep ".*" test 匹配所有,包括空行
787 grep "^M" test 所有以M开头的行
788 grep "r$" test 所有以r结尾的行
789 grep "y$" test
792 grep -n "^$" test 所有空行
793 grep "s[ao]id" test 在s d之间有a或O的行
794 grep "[0-9]" test 含有数字的行 不包括空白行
795 grep "[^0-9]" test 不含数字的行 不包括空白行
796 grep "^[^0-9]" test 不以非数字开头的行 不包括空白行
797 grep "^[0-9]" test 不以数字开头的行,不包括空白行
798 grep "\.$" test 匹配任意字符结尾的行 不包括空白行
799 grep "a\{3,\}" test 至少包含3个a
800 grep "a\{3\}" test 至少包含3个a
801 grep "a\{3,4\}" test 至少包含3个a
802 grep "a\{3,3\}" test 至少包含3个a
803 grep "a\{3,4\}id" test 加上a和id限制,匹配在a和id之间至少3,不超过4个a
2.字符截取命令
cut字段截取命令
[mq@mq shell]$ cut -f 1,3 student.txt
[mq@mq shell]$ cut -d ":" -f 1,3 /etc/passwd
[mq@mq shell]$ cat /etc/passwd|grep "/bin/bash"
root:x:0:0:root:/root:/bin/bash
mq:x:1000:1000:mq:/home/mq:/bin/bash
[mq@mq shell]$ cat /etc/passwd|grep "/bin/bash"|grep -v "root"
mq:x:1000:1000:mq:/home/mq:/bin/bash
[mq@mq shell]$ cat /etc/passwd|grep "/bin/bash"|grep -v "root"|cut -d ":" -f 1
mq
[mq@mq shell]$ df -h |grep "fedora-root"|cut -d " " -f 5
//cut不好实现空格分割的字段
##printf
%ns | 输出字符串型 |
---|---|
%ni | 输出整数 |
%m.nf | 位数和整数位数 |
[mq@mq shell]$ printf '%s %s %s' 1 2 3 4 5 6
1 2 34 5 6[mq@mq shell]$ printf '%s %s %s ' 1 2 3 4 5 6
1 2 3 4 5 6 [mq@mq shell]$
[mq@mq shell]$ printf "%s\n%s\n%s\n" 1 2 3
1
2
3
[mq@mq shell]$ printf "%s" $(cat mq)//没有格式输出
IDNamegenderMark1LimingM862ScM903GaoM83[mq@mq shell]$
[mq@mq shell]$ printf "%s\t%s\t%s\t%s\n" $(cat mq)//加了格式控制
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Gao M 83
awk命令
awk ‘条件1{动作一}条件2{动作2}…’ 文件名
条件 关系表达式为条件
动作 :格式化的输出或者流程控制语句
[mq@mq shell]$ cat student.txt
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ awk '{printf $2"\t" $6 "\n"}' student.txt
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
[mq@mq shell]$ df -h|awk '{print $1 "\t" $5 "\t" $6}'
文件系统 已用% 挂载点
devtmpfs 0% /dev
tmpfs 1% /dev/shm
tmpfs 1% /run
tmpfs 0% /sys/fs/cgroup
/dev/mapper/fedora-root 16% /
tmpfs 1% /tmp
/dev/sda5 15% /boot
/dev/mapper/fedora-home 16% /home
tmpfs 1% /run/user/42
tmpfs 2% /run/user/1000
/dev/sda2 29% /run/media/mq/本地磁盘
[mq@mq shell]$ df -h|grep sda5|awk '{print $5}'
15%
[mq@mq shell]$ df -h|grep sda5|awk '{print $5}'|cut -d % -f 1
15
BEGIN //在所有处理之前要执行BEGIN后边的
[mq@mq shell]$ awk 'BEGIN{printf "This is a transcript\n"}{printf $2 "\t" $6 "\n"}' student.txt
This is a transcript
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
[mq@mq ~]$ awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[mq@mq ~]$ awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd //强制awk读取第一行前先确定分割符
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
//显示可以登陆用户的密码和PID
[mq@mq shell]$ cat /etc/passwd|grep "/bin/bash"|awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'
root 0
mq 1000
END
与BEGIN相反
[mq@mq shell]$ awk 'END{printf "end\n"}{printf $1 "\t" $6 "\n"}' student.txt
ID Average
1 87.66
2 85.66
3 91.66
end
[mq@mq sxhell]$ cat student.txt|grep -v Name|awk '$6>=87 {printf $2 "\n"}'
Liming
Gao
sed
轻量级的流编辑器:用管道符实现命令结果的编辑
sed 选项 ‘动作’ 文件名
选项 -n -e -i
动作:
a\ 追加
c\ 行替换
i: 插入
d: 删除
p:打印
s:字符串替换
针对行输出:
[mq@mq shell]$ ls
a.txt shell2.sh shell5.sh shellrc test wo.txt
mq shell3.sh shell6.sh shell.sh test.txt
oper1.sh shell4.sh shell7.sh student.txt testx.sh
[mq@mq shell]$ sed '2p' student.txt
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed -n '2p' student.txt
1 Liming 82 95 86 87.66
[mq@mq shell]$ df -h|sed -n '2p'
devtmpfs 1.9G 0 1.9G 0% /dev
[mq@mq shell]$ cat gtest
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed '2,4d' gtest //不加-i只会修改输出,不会修改源文件
ID Name PHP Linux Mysql Average
[mq@mq shell]$ cat gtest
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed -i '2,4d' gtest
[mq@mq shell]$ cat gtest
ID Name PHP Linux Mysql Average
[mq@mq shell]$ sed '2a hello' gtest
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
hello
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed '2i hello \ //\代表行未结束按回车继续输出
> world ' gtest
ID Name PHP Linux Mysql Average
hello
world
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
不写入文件式的替换
[mq@mq shell]$ cat student.txt
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed '3s/74/99/g' student.txt
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66
写入文件 (-i)的替换
[mq@mq shell]$ cat gtest
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[mq@mq shell]$ sed -i '3s/74/99/g' gtest
[mq@mq shell]$ cat gtest
ID Name PHP Linux Mysql Average
1 Liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66
3.字符处理命令
排序命令 sort 选项 文件名
sort /etc/passwd //按字母a-z顺序排序
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:995:993::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mq:x:1000:1000::/home/hp:/bin/bash
libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql-proxy:x:994:992:MySQL-Proxy user:/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
rater:x:1001:1001::/home/rater:/bin/bash
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
saslauth:x:993:76:Saslauthd user:/run/saslauthd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
[root@_240_centos ~]#sort -r /etc/passwd //按字母z-a排序
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
saslauth:x:993:76:Saslauthd user:/run/saslauthd:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
rater:x:1001:1001::/home/rater:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
mysql-proxy:x:994:992:MySQL-Proxy user:/:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
mq:x:1000:1000::/home/hp:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
chrony:x:995:993::/var/lib/chrony:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
----------
[root@VM_47_240_centos ~]# sort -t ":" -k 3,3 /etc/passwd //将冒号分割的开始第3列,结束位置也是第三列按照字母顺序排序,即10 排在2前边
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hp:x:1000:1000::/home/hp:/bin/bash
rater:x:1001:1001::/home/rater:/bin/bash
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
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
adm:x:3:4:adm:/var/adm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
saslauth:x:993:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mysql-proxy:x:994:992:MySQL-Proxy user:/:/sbin/nologin
chrony:x:995:993::/var/lib/chrony:/sbin/nologin
libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
----------
[root@VM_47_240_centos ~]# sort -nt ":" -k 3,3 /etc/passwd //按照阿拉伯数字顺序排
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
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
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
saslauth:x:993:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mysql-proxy:x:994:992:MySQL-Proxy user:/:/sbin/nologin
chrony:x:995:993::/var/lib/chrony:/sbin/nologin
libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
hp:x:1000:1000::/home/hp:/bin/bash
rater:x:1001:1001::/home/rater:/bin/bash
统计命令
wc 选项 文件名
选项
选项 | 作用 |
---|---|
-l | 只统计行数 |
-w | 统计单词数 |
-m | 统计字符数 |
[root@VM_47_240_centos ~]# wc -l /etc/passwd
34 /etc/passwd
[root@VM_47_240_centos ~]# df -h |wc -m
325
[root@VM_47_240_centos ~]# df -h |wc -w
43
4.条件判断
选项 | 作用 |
---|---|
-d | 文件是否存在并是否为目录文件 |
-e | 判断文件是否存在 |
-f | 文件是否存在,是否普通文件 |
-r | 文件是否存在,且具有写权限 |
-w | 文件是否存在,是否可写文件 |
-x | 文件是否存在,是否可执行文件 |
[root@VM_47_240_centos ~]# test -e /root/install.log
[root@VM_47_240_centos ~]# echo $?
1 //不存在的文件返回值
[root@VM_47_240_centos ~]# test -e /etc/passwd
[root@VM_47_240_centos ~]# echo $?
0 //存在的
[root@VM_47_240_centos ~]# [ -e /etc/passwd ]
[root@VM_47_240_centos ~]# echo $?
0
[mq@mq ~]$ [ -e /home/mq ]
[mq@mq ~]$ echo $?
0
[mq@mq ~]$ [ -e /home/h ]
[mq@mq ~]$ echo $?
1
判断root是一个目录
[root@VM_47_240_centos ~]# [ -d /root ] && echo "yes"
yes
判断是否存在并具有写权限
//判断是否存在并具有写权限
[root@VM_47_240_centos ~]# [ -w /etc/passwd ]&& echo "yes"||echo "no"
yes
[root@VM_47_240_centos ~]# [ -w /etc/student ]&& echo "yes"||echo "no"
no
两个文件比较
选项 | 作用 |
---|---|
文件1 -nt 文件2 | 文件1比文件2新 |
文件1 -ot 文件2 | 文件1比文件2旧 |
文件1 -et 文件2 | 文件1和文件2Inode号一致,用于判断硬链接 |
两个整数比较(当数值处理)
选项 | 作用 |
---|---|
整数1 -eq 整数2 | 判断整数1是否与整数2相等 |
整数1 -ne 整数2 | 判断整数1是否与整数2不相等 |
整数1 -gt 整数2 | 判断整数1是否大于整数2 |
整数1 -lt 整数2 | 判断整数1是否小于整数2 |
整数1 -ge 整数2 | 判断整数1是否大于等于整数2 |
整数1 -le 整数2 | 判断整数1是否小于等于整数2 |
[root@VM_47_240_centos ~]# [ 23 -gt 22 ]&&echo "yes"||echo no
yes
5 字符串的判断
测试选项 | 作用 |
---|---|
-z 字符串 | 判断字符串是否为空 |
-n 字符串 | 判断字符串是否为非空 |
字串1==字串2 | 判断字符串1是否和字符串2相等 |
字符串1!=字符串2 | 判断字符串1是否和字符串2不相等 |
//判断 name变量是否为空
[root@VM_47_240_centos ~]# [ -z "$name" ]&&echo "NULL"||echo "no"
no
[root@VM_47_240_centos mq]# ./shell.sh
!=
[root@VM_47_240_centos mq]# cat shell.sh
#!/bin/bash
aa=1//字符串型
bb=2
#判断aa的值等不等于bb的值,不等于输出!=
[ "$aa" == "$bb" ] && echo "="||echo "!="
多重条件判断
选项 | 作用 |
---|---|
判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终结果才会真 |
判断1 -o 判断2 | 逻辑或,判断有一个成立,结果就为真 |
!判断 | 逻辑非,取反 |
[root@VM_47_240_centos ~]# [ -n "aa" -a 24 -gt 26 ]&& echo "yes"||echo no
no 结果分析 aa 字符串 24小于26为假返回no
[root@VM_47_240_centos ~]# [ -n "aa" -a 27 -gt 26 ]&& echo "yes"||echo no
yes
5.流程控制
if
if [ 条件 ] ;then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi