8.4 linux shell 中的特殊符号
* 代表零个或多个任意字符
[root@localhost ~]#ls /etc/*.d |tail
/etc/yum.repos.d:
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo
?只代表一个任意的字符
[root@localhost tmp]# touch 1/1.txt 1/23.txt
[root@localhost tmp]# ls 1/?.txt
1/1.txt
注释符号
#在linux中表示注释说明,即#后面的内容都会被忽略
[root@localhost tmp]# a=1 #1111
[root@localhost tmp]# echo $a
1
脱义字符\
\会将后面的特殊符号(如*)还原为普通字符
[root@localhost tmp]# ls 1/\*.txt
ls: 无法访问1/*.txt: 没有那个文件或目录
[root@localhost tmp]# ls 1/*.txt
1/1.txt 1/23.txt
管道符|
|作用是将前面命令的输出作为后面命令的输入
[root@localhost ~]# ls /etc/*.d |tail
8.4.1 命令cut
cut命令 用来截取某一个字段
语法:cut -d ‘分割字符’ [-cf] n (n表示数字)
参数:
-d 后面跟分割字符,分割字符要用单引号括起来
-c 后面接的是第几个字符 (后面可以是数字,也可以是区间n1-n2)
-f 后面接的是第几块区块(后面与数字间的空格可有可无)[root@localhost tmp]# cat /etc/passwd |cut -d ‘:’ -f 1 |head -5
root
bin
daemon
adm
lp
-
[root@localhost tmp]# cat /etc/passwd |cut -c 5 |head -2
- x
[root@localhost tmp]# cat /etc/passwd |cut -c 1,3,7 |head -2
ro:
bn1
8.4.2 命令sort
sort命令 用作排序
语法:sort [-t 分隔符] [-kn1,n2] [-nru] (n1,n2代表数字)
参数:
-t 后面跟分割字符
-n 表示使用纯数字排序
-r 表示反向排序
-u 表示去重复
-kn1,n2 表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出
[root@localhost tmp]# head -n5 /etc/passwd |sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash[root@localhost tmp]# head -n5 /etc/passwd |sort -k3,5 -r
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
8.4.3 命令wc
wc命令 用于统计文档的行数、字符数或词数(默认会统计换行符)
参数:
-l 统计行数
-m 统计字符数
-w 统计词数
-L 不统计换行符
如果wc不加任何参数,直接跟文档,则会把++++行数、词数和字符++数++依次输出
[root@localhost tmp]# cat 1/1.txt
abc=123 #aaaa
\
[root@localhost tmp]# wc 1/1.txt
2 2 15 1/1.txt
[root@localhost tmp]# wc
^H^H^C
[root@localhost tmp]# wc -L 1/1.txt
13 1/1.txt
[root@localhost tmp]#
8.4.4 命令uniq
uniq命令 用来删除重复的行
-c 表示统计重复的行数,并把重复行的次数写在前面
使用uniq之前,必须先给文件排序,否则不管用
[root@localhost tmp]# cat 1/1.txt
111
222
111
333
333
[root@localhost tmp]# uniq 1/1.txt
111
222
111
333
[root@localhost tmp]# sort 1/1.txt |uniq
111
222
333
[root@localhost tmp]# sort 1/1.txt |uniq -c
2 111
1 222
2 333
8.4.5 命令tee
tee命令 后面跟文件名,作用类似于重定向> ,同时显示在屏幕上。常用于管道符| 后面
[root@localhost tmp]# echo “111111” |tee 1/1.txt
111111
[root@localhost tmp]# cat 1/1.txt
111111
8.4.6 命令tr
tr命令 用于替换字符,常用来处理文档中出现的特殊字符
参数:
-d 表示删除某个字符,后面跟要删除的字符
-s 表示删除重复的字符
tr命令常用于把小写字母变成大写字母,如 tr ‘[a-z]’ ‘[A-Z]’
[root@localhost tmp]# head -2 /etc/passwd |tr ‘[a-z]’ ‘[A-Z]’
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
8.4.7 命令split
split命令 用于切割文档
参数:
-b 表示根据大小来分割文档,单位为byte
-l 表示根据行数来分割文档
如果split不指定目标文件名,则会以xaa、xab这样的文件名来存取切割后的文档,也可以自己指定文件名
8.4.8 特殊符号
符号$
符号 ,表示上一条命令中的最后一个变量
[root@localhost tmp]# cat 1/1.txt
111111
[root@localhost tmp]# ls !$
ls 1/1.txt
1/1.txt
符号;
在两条命令之间加上 符号; 可以在一行中运行多个命令
[root@localhost tmp]# cd 1 ;cat 1.txt
111111
[root@localhost 1]#
符号~
符号~ 表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username
符号&
在命令后面加上符号& ,可以把命令放到后台运行
中括号[]
中括号内为字符组合,代表字符组合中的任意一个,可以是一个范围(0-9,a-z)
&&和||
- command1 ; command2 使用 ; 时,不管command1是否执行成功,都会执行command2
- command1 && command2 使用 && 时,只有command1执行成功后command2才会执行,否则command2不执行
- command1 || command2 使用 || 时,command1执行成功后则command2不执行,否则执行command2
8.4.9 命令read
read命令 后面跟的是变量名,可以是1个,也可以是多个,用空格分隔。回车后,输入的字符就是在给这些变量赋值,输入的字符串也需要用空格分隔,一一对应
[root@localhost 1]# read a b c
1 2 3
[root@localhost 1]# echo b
2
[root@localhost 1]# echo $c
3
对于命令history 1 | { read x cmd; echo “$cmd”; },管道前面,history 1表示取最后一条命令。管道后面’{ }’内是一整体,相当于一个函数,函数里面可以有多条命令,用分号分割,而且最后一条命令也必须加分号。第一条命令和’{‘之间必须要有空格。
相关资料: 命令history 1 | { read x cmd; echo “$cmd”; }
补充:
fork, exec, source的区别:
1. fork ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。
fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本。
运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
sub-shell执行完毕后返回parent-shell。sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
2. exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。
exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本。被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别
3. source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用
相关资料: fork, exec, source的区别