8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split shell特殊符号下

8.10 shell特殊符号

*代表零个或多个任意字符

[root@localhost ~]# ls /tmp/4_6/test*
/tmp/4_6/testa

/tmp/4_6/test:
test1  test111  test4  test5


?只代表一个任意字符

[root@localhost ~]# ls -d /tmp/4_6/test?
/tmp/4_6/testa

注释符号#

表示注释说明,即#后面的内容都会被忽略。

[root@localhost ~]# abc=123 #aaaaa
[root@localhost ~]# echo $abc
123
[root@localhost ~]# abc=123 aaaaa
bash: aaaaa: 未找到命令...

脱义字符\

这个字符会将后面的特殊符号(如*)还原为普通字符。

[root@localhost ~]# ls -d test\*
ls: 无法访问test*: 没有那个文件或目录

管道符|


它的作用是将前面命令的输出作为后面命令的输入。一般针对文档操作的命令比较常用。例如cat,less,head,tail,grep,cut,sort,wc,uniq,tee,tr,split,sed,awk等。

[root@localhost ~]# cat testb.txt |wc -l
0

wc -l用来计算一个文档有多少行。

cut命令

cut命令用来截取某一个字段,其格式为cut -d "分割字符"[-cf]n,这里的n是数字。

  • -d:后面跟分割字符,分割字符要用单引号括起来。

  • -c:后面接的是第几个字符。

  • -f:后面接的是第几个区块。

[root@localhost ~]# cat /etc/passwd|cut -d ':' -f 1 |head -5
root
bin
daemon
adm
lp

-d选项后面加冒号作为分隔符,-f1表示截取第一段,-f和1之间的空格可有可无。

[root@localhost ~]# head -n2 /etc/passwd|cut -c2
o
i
[root@localhost ~]# head -n2 /etc/passwd|cut -c1
r
b
[root@localhost ~]# head -n2 /etc/passwd|cut -c1-10
root:x:0:0
bin:x:1:1:

-c选项后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2和n3.

[root@localhost ~]# head -n2 /etc/passwd|cut -c1,3,10
ro0
bn:

命令sort

sort命令用作排序,其格式为sort [-t 分隔符] [-kn1,n2] [-nru],这里n1和n2指的是数字。

  • -t:后面跟分隔符,作用跟cut的-d选项一样。

  • -n:表示使用纯数字排序。

  • -r:表示反向排序。

  • -u:表示去重复。

  • -kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。

如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。示例命令如下:

[root@localhost ~]# 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

-t选项后面跟分隔符,-k选项后面跟单个数字表示对第几个区域的字符串排序,-n选项则表示使用纯数字排序。示例命令如下:

[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3 -n
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

-k选项后面跟数字n1和n2表示对n1和n2区域内的字符串排序,-r选项则表示反向排序。示例命令如下:

[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3,5 -r
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

这里的-k3,5表示对第3区域至第5区域间的字符串排序。

wc命令

wc命令用于统计文档的行数、字符数或词数。

  • -l:统计行数

  • -m:统计字符数

  • -w:统计词数。

[root@localhost ~]# wc /etc/passwd
  43   86 2237 /etc/passwd
[root@localhost ~]# wc -l /etc/passwd
43 /etc/passwd
[root@localhost ~]# wc -m /etc/passwd
2237 /etc/passwd
[root@localhost ~]# wc -w /etc/passwd
86 /etc/passwd

如果wc不跟任何选项,直接跟文档,则会把行数、词数和字符数依次输出。

命令uniq

uniq命令用来删除重复的行,该命令只有-c选项比较常用,它表示统计重复的行数,并把行数写在前面。编写一个文件,示例命令如下:

[root@localhost ~]# vim testb.txt

使用uniq前,必须先给文件排序,否则不管用。

[root@localhost ~]# uniq testb.txt
111
222
111
333111
[root@localhost ~]# sort testb.txt |uniq
111
222
333
333111
[root@localhost ~]# sort testb.txt |uniq -c
    112 111
    111 222
      1 333
    110 333111

命令tee

tee命令后面跟文件名,其作用类似于重定向>,但它比重定向多一个功能,即把文件写入后面所跟文件时,还显示在屏幕上。该命令常用于管道符|后。

[root@localhost ~]# cat testb.txt
111
222
111
333111

命令tr

tr命令用于替换字符,常用来处理文档中出现的特殊符号,如dos文档出现的符号^M。

  • -d:表示删除某个字符,后面跟要删除的字符。

  • -s:表示删除重复的字符。

tr命令常用于把小写字母变成大写字母,如tr '[a-z] '[A-Z]'。示例命令如下:

[root@localhost ~]# head -n2 /etc/passwd |tr '[a-z]' '[A-Z]'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

tr命令还可以替换一个字符,示例命令如下:

[root@localhost ~]# grep 'root' /etc/passwd |tr 'r' 'R'
Root:x:0:0:Root:/Root:/bin/bash
opeRatoR:x:11:0:opeRatoR:/Root:/sbin/nologin

替换、删除以及去重复等操作都是针对一个字符来讲的,如果是针对一个字符串,就不能使用了。

命令split

split命令用于切割文档。

  • -b:表示依据大小来分割文档。示例命令如下:

[root@localhost ~]# mkdir split_dir
[root@localhost ~]# cd !$
cd split_dir
[root@localhost split_dir]# cp /etc/passwd ./
[root@localhost split_dir]# split -b 500 passwd
[root@localhost split_dir]# ls
passwd  xaa  xab  xac  xad  xae

split不指定文件名,则会以xaa,xab...这样的文件名来存取切割后的文件。也可以指定目标文件名,示例命令如下:

[root@localhost split_dir]# rm -f xa*
[root@localhost split_dir]# split -b 500 passwd 123
[root@localhost split_dir]# ls
123aa  123ab  123ac  123ad  123ae  passwd

-l:表示依据行数来分割文档,示例命令如下:

[root@localhost split_dir]# rm -f 123a*
[root@localhost split_dir]# split -l 10 passwd
[root@localhost split_dir]# wc -l *
  43 passwd
  10 xaa
  10 xab
  10 xac
  10 xad
   3 xae
  86 总用量

shell特殊符号下

特殊符号$

符号$可以用作变量前面的标识符,还可以和!结合起来使用。示例命令如下:

[root@localhost split_dir]# cd ..
[root@localhost ~]# ls testb.txt
testb.txt
[root@localhost ~]# ls !$
ls testb.txt
testb.txt
[root@loca

!$表示上条命令中的最后一个变量。

特殊符号;

在一行中运行两个或两个以上的命令,需要在命令之间加符号;。示例命令如下:

[root@localhost ~]# mkdir testdir;touch test1.txt;touch test2.txt;ls -d test*
test1.txt  test2.txt  testb.txt  testdir  test.txt

特殊符号~

符号~表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username。

示例命令如下:

[root@localhost ~]# su test10
[test10@localhost root]$ cd ~
[test10@localhost ~]$ pwd
/home/test10
[root@localhost ~]# cd ~
[root@localhost ~]# pwd
/root

特殊符号&

如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况。比如,可以用在sleep后,如下所示:

[test10@localhost ~]$ sleep 30 &
[1] 8817
[test10@localhost ~]$ jobs
[1]+  运行中               sleep 30 &

重定向符号>,>>,2>和2>>

重定向符号>和>>,它们分别表示取代和追加的意思。如果想重定向到一个文本,则要用重定向符号2>或者2>>,它们分别表示错误重定向和错误追加重定向。示例如下:

[test10@localhost ~]$ ls aaaa
ls: 无法访问aaaa: 没有那个文件或目录
[test10@localhost ~]$ ls aaaa 2> /tmp/error
[test10@localhost ~]$ cat /tmp/error
ls: 无法访问aaaa: 没有那个文件或目录
[test10@localhost ~]$ ls aaaa 2>> /tmp/error
[test10@localhost ~]$ cat /tmp/error
ls: 无法访问aaaa: 没有那个文件或目录
ls: 无法访问aaaa: 没有那个文件或目录

中括号 []

中括号内为字符组合,代表字符组合中的任意一个,可以是任意一个范围(1-3,a-z),用法如下:

[root@localhost 10]# ls -d test*
test1.txt  test2.txt  testb.txt  testdir
[root@localhost 10]# ls -d test[1-3].txt
test1.txt  test2.txt
[root@localhost 10]# ls -d test[12b].txt
test1.txt  test2.txt  testb.txt
[root@localhost 10]# ls -d test[1-9].txt
test1.txt  test2.txt
[root@localhost 10]# ls -d test[1-9a-z].txt
test1.txt  test2.txt  testb.txt

特殊符号&&和||

&&和||可以用于多条命令中间的特殊符号。

  • command1;command2   不管command1是否执行成功,都会执行command2。

  • command1&&command2  只有command1执行成功后,command2才会执行,否则command2不执行。

  • 使用||时只有command1执行成功后则command2不执行,否则执行command2,即command1和command2中总有一条命令会执行。用法如下:

[root@localhost 10]# rm -rf test*
[root@localhost 10]# touch test1 test3
[root@localhost 10]# ls test2 &&touch test2
ls: 无法访问test2: 没有那个文件或目录
[root@localhost 10]# ls test2 && touch test2
ls: 无法访问test2: 没有那个文件或目录
[root@localhost 10]# ls test2
ls: 无法访问test2: 没有那个文件或目录

本例中,只有当ls test2成功执行后,才会执行touch test2。因为test2不存在,ls test2没有执行成功,所以&&后面的touch test2

并没有执行。

[root@localhost 10]# ls test2 ||touch test2
ls: 无法访问test2: 没有那个文件或目录
[root@localhost 10]# ls test*
test1  test2  test3

本例中,若ls test2执行不成功,则会执行touch test2。因为test2不存在,所以ls test2没有执行成功,转而执行||后面的touch test2,所以增加了test2这个文件。