linux shell入门4

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 至少包含3a 
  800  grep "a\{3\}" test  至少包含3a 
  801  grep "a\{3,4\}" test 至少包含3a 
  802  grep "a\{3,3\}" test 至少包含3a 
  803  grep "a\{3,4\}id" test 加上a和id限制,匹配在a和id之间至少3,不超过4a

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

case
for
while######xxxx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值