8.4 linux shell 中的特殊符号
* 代表零个或多个任意字符
# 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
?只代表一个任意的字符
# touch 1/1.txt 1/23.txt# ls 1/?.txt1/1.txt
注释符号#
#
在linux中表示注释说明,即#
后面的内容都会被忽略。
# a=1 #1111# echo $a1
脱义字符\
\
会将后面的特殊符号(如*
)还原为普通字符。
# ls 1/\\\*.txtls: 无法访问1/*.txt: 没有那个文件或目录# ls 1/\*.txt1/1.txt 1/23.txt
管道符|
|
作用是将前面命令的输出作为后面命令的输入。
# ls /etc/\.d | tail
命令cut
cut
命令用来截取某一个字段。
语法:cut -d 分割字符 -[cf] n(n表示数字)
- 参数:
-d 后面跟分割字符,分割字符要用单引号括起来
-c 后面接的是第几个字符 (后面可以是数字,也可以是区间n1-n2)
-f 后面接的是第几块区块(后面与数字间的空格可有可无)
# cat /etc/passwd | cut -d ':' -f 1 | head -5root
bin
daemon
adm
lp# cat /etc/passwd | cut -c 5 | head -2:x# cat /etc/passwd |cut -c 1,3,7 |head -2ro:
bn1
命令sort
sort
命令用作排序。
语法:sort -t 分隔符 -kn1,n2 -nru (n1,n2代表数字)
- 参数:
-t 后面跟分割字符
-n 表示使用纯数字排序
-r 表示反向排序
-u 表示去重复
-kn1,n2 表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
如果sort
不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。
# head -n5 /etc/passwd | sortadm: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# head -n5 /etc/passwd | sort -k3,5 -rroot: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
命令wc
wc
命令用于统计文档的行数、字符数或词数(默认会统计换行符)。
- 参数:
-l 统计行数
-m 统计字符数
-w 统计词数
-L 不统计换行符
如果wc
不加任何参数,直接跟文档,则会把行数、词数和字符数依次输出。
# cat 1/1.txtabc=123 #aaaa\# wc 1/1.txt
2 3 16 1/1.txt# wc -L 1/1.txt 13 1/1.txt
命令uniq
uniq
命令用来删除重复的行。
-c 表示统计重复的行数,并把重复行的次数写在前面
使用uniq
之前,必须先给文件排序,否则不起作用。
# cat 1/1.txt111
222
111
333
333# uniq 1/1.txt111
222
111
333# sort 1/1.txt | uniq111
222
333# sort 1/1.txt | uniq -c
2 111
1 222
2 333
命令tee
tee
命令后面跟文件名,作用类似于重定向>
,同时显示在屏幕上。常用于管道符|
后面。
# echo "111111" | tee 1/1.txt111111# cat 1/1.txt111111
命令tr
tr
命令用于替换字符,常用来处理文档中出现的特殊字符。常用于把小写字母变成大写字母,如tr '[a-z]' '[A-Z]'
。
- 参数:
-d 表示删除某个字符,后面跟要删除的字符
-s 表示删除重复的字符
# 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
命令split
split
命令用于切割文档。
- 参数:
-b 表示根据大小来分割文档,单位为byte
-l 表示根据行数来分割文档
如果split
不指定目标文件名,则会以xaa、xab这样的文件名来存取切割后的文档,也可以自己指定文件名。
特殊符号
- 符号
$
:
符号$
可以用作变量前面的标识符,与!
组合为!$
,表示上一条命令中的最后一个变量。
# cat 1/1.txt 111111
# ls !$ls 1/1.txt
1/1.txt
- 符号
;
:
在两条命令之间加上符号;
可以在一行中运行多个命令。
# cd 1/ ;cat 1.txt 111111
- 符号
~
:
符号~
表示用户的家目录,root用户的家目录是/root
,普通用户则是/home/username
。
- 符号
&
:
在命令后面加上符号&
,可以把命令放到后台运行。
- 中括号
[]
:
中括号[]
内为字符组合,代表字符组合中的任意一个,可以是一个范围(0-9,a-z)。
&&
和||
:
command1; command2 使用 ; 时,不管command1是否执行成功,都会执行command2
command1 && command2 使用 && 时,只有command1执行成功后command2才会执行,否则command2不执行
command1 || command2 使用 || 时,command1执行成功后则command2不执行,否则执行command2
命令read
read
命令后面跟的是变量名,可以是1个,也可以是多个,用空格分隔。回车后,输入的字符就是在给这些变量赋值,输入的字符串也需要用空格分隔,一一对应。
# read a b c1 2 3# echo $a1# echo $b2# echo $c3
fork, exec, source
- fork, exec, source的区别:
- 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 - exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。
exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本。被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别 - source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用
相关资料: fork, exec, source的区别
更多资料参考:
sort命令的几个细节问题