8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下
[root@lizhipeng01 ~]# ls
111 234 anaconda-ks.cfg dir3 test5 yum.log
123 2.txt a.txt dir4 testb.txt 学习计划安排.txt
1_hard.txt 2.txt.bak bb split_dir testc.txt
1.txt 3.txt dir2 test4 Thinking_In_Java(中文版_第四版).pdf
[root@lizhipeng01 ~]# ls test*
test4 test5 testb.txt testc.txt
[root@lizhipeng01 ~]# ls test?
test4 test5
[root@lizhipeng01 ~]# ls test\* 脱意字符,*没有了特殊意义
ls: 无法访问test*: 没有那个文件或目录
[root@lizhipeng01 ~]#
[root@lizhipeng01 tmp]# abc=123 #aaa
[root@lizhipeng01 tmp]# echo $abc
123
命令cat
cut命令用来截取某一个字段,其格式为cut -d '分隔字符' [-cf] n,n表示数字。
-d:后面跟分隔字符,分隔字符要用单引号括起来
-c:后面接的是第几个字符
-f:后面接的是第几块区块
[root@lizhipeng01 ~]# cat /etc/passwd |cut -d ':' -f 1 |head -5 取/etc/passwd文件头5行的第一列
root
bin
daemon
adm
lp
-d选项后面加冒号作为分隔字符,-f 1表示截取第一段,-f和1之间的空格可有可无。
[root@lizhipeng01 ~]# head -n2 /etc/passwd |cut -c2
o
i
[root@lizhipeng01 ~]# head -n2 /etc/passwd |cut -c1
r
b
[root@lizhipeng01 ~]# head -n2 /etc/passwd |cut -c1-10
root:x:0:0
bin:x:1:1:
[root@lizhipeng01 ~]#
[root@lizhipeng01 ~]# head -n2 /etc/passwd |cut -c5-10
:x:0:0
x:1:1:
-c选项后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2和n3。
[root@lizhipeng01 ~]# head -n2 /etc/passwd |cut -c1,3,10
ro0
bn:
sort命令用作排序,其格式为sort [-t 分隔符] [-kn1,n2] [-nru],这里n1和n2指的是数字
-t:后面跟分隔字符,作用跟cut的-d选项一样
-n:表示使用纯数字排序
-r:表示反向排序
-u:表示去重复
-kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。
[root@lizhipeng01 ~]# sort /etc/passwd sort排序,按照首字符向后依次按ASCII码值进行比较,最后将它们按升序输出
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
bin:x:1:1:bin:/bin:/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
lizhipeng:x:1000:1000::/home/lizhipeng:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@lizhipeng01 ~]# 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@lizhipeng01 ~]# 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@lizhipeng01 ~]# 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
命令wc
wc命令用于统计文档的行数、字符数或词数。该命令的常用选项有-l(统计行数)、-m(统计字符数)和-w(统计词数)
[root@lizhipeng01 ~]# wc /etc/passwd
26 44 1211 /etc/passwd
[root@lizhipeng01 ~]# wc -l /etc/passwd
26 /etc/passwd
[root@lizhipeng01 ~]# wc -m /etc/passwd
1211 /etc/passwd
[root@lizhipeng01 ~]# wc -w /etc/passwd
44 /etc/passwd
wc不跟任何选项,直接跟文档,则会把行数、词数和字符数依次输出。
命令uniq
uniq命令用来删除重复的行,该命令只有-c选项比较常用,它表示统计重复的行数,并把行数写在前面
[root@lizhipeng01 ~]# vim testb.txt
111
222
111
333
使用uniq前,必须先给文件排序,否则不管用
[root@lizhipeng01 ~]# uniq testb.txt
111
222
111
333
[root@lizhipeng01 ~]# sort testb.txt |uniq
111
222
333
[root@lizhipeng01 ~]# cat testb.txt
111
222
111
333
[root@lizhipeng01 ~]# sort testb.txt |uniq -c
2 111
1 222
1 333
命令tee
tee命令后面跟文件名,其作用类似于重定向>,但是它比重定向多了一个功能,即把文件写入后面所跟的文件时,还显示在屏幕上
该命令常用于管道符|后
[root@lizhipeng01 ~]# echo "kkkkkkkk" |tee testb.txt
kkkkkkkk
[root@lizhipeng01 ~]# cat testb.txt
kkkkkkkk
命令tr
tr命令用于替换字符,常用来处理文档中出现的特殊字符
-d:表示删除某个字符,后面跟要删除的字符
-s:表示删除重复的字符
[root@lizhipeng01 ~]# 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
[root@lizhipeng01 ~]# 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和-l。
-b:表示依据大小来分割文档,单位为byte。
[root@lizhipeng01 ~]# mkdir split_dir
mkdir: 无法创建目录"split_dir": 文件已存在
[root@lizhipeng01 ~]# cd split_dir
[root@lizhipeng01 split_dir]# ls
passwd xaa xab
[root@lizhipeng01 split_dir]# cp /etc/passwd ./
cp:是否覆盖"./passwd"? y
[root@lizhipeng01 split_dir]# split -b 500 passwd
[root@lizhipeng01 split_dir]# ls
passwd xaa xab xac
如果split不指定目标文件名,则会以xaa、xab...这样的文件名来存取切割后的文件。也可以指定文件名
[root@lizhipeng01 split_dir]# rm -f xa*
[root@lizhipeng01 split_dir]# split -b 500 passwd 123
[root@lizhipeng01 split_dir]# ls
123aa 123ab 123ac passwd
-l:表示依据行数来分割文档
[root@lizhipeng01 split_dir]# rm -f 123a*
[root@lizhipeng01 split_dir]# split -l 10 passwd
[root@lizhipeng01 split_dir]# wc -l *
26 passwd
10 xaa
10 xab
6 xac
52 总用量
特殊符号$
符号$可以用作变量前面的标识符,还可以和!结合起来使用
[root@lizhipeng01 split_dir]# cd ..
[root@lizhipeng01 ~]# ls testb.txt
testb.txt
[root@lizhipeng01 ~]# ls !$
ls testb.txt
testb.txt
!$表示上条命令中最后一个变量。
特殊符号;
一行中运行两个或两个以上的命令,需要在命令之间加符号
特殊符号~
符号~表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username。
[root@lizhipeng01 ~]# cd ~
[root@lizhipeng01 ~]# pwd
/root
[root@lizhipeng01 ~]# su - lizhipeng
上一次登录:四 1月 11 05:19:32 CST 2018pts/0 上
[lizhipeng@lizhipeng01 ~]$ cd ~
[lizhipeng@lizhipeng01 ~]$ pwd
/home/lizhipeng
特殊符号&
如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况,例如,可以用在sleep后。
[lizhipeng@lizhipeng01 ~]$ sleep 30 &
[1] 2737
[lizhipeng@lizhipeng01 ~]$ jobs
[1]+ 运行中 sleep 30 &
重定向符号>、>>、2>和2>>
重定向符号>和>>,它们分别表示取代和追加的意思。当运行一个命令报错时,报错信息会输出到当前屏幕。如果想重定向到一个文本,则需要用重定向符号2>或者2>>,它们分别表示错误重定向和错误追加重定向。
[root@lizhipeng01 ~]# ls aaaa
ls: 无法访问aaaa: 没有那个文件或目录
[root@lizhipeng01 ~]# ls aaaa 2> /tmp/error
[root@lizhipeng01 ~]# cat /tmp/error
ls: 无法访问aaaa: 没有那个文件或目录
[root@lizhipeng01 ~]# ls aaaa 2>> /tmp/error
[root@lizhipeng01 ~]# cat /tmp/error
ls: 无法访问aaaa: 没有那个文件或目录
ls: 无法访问aaaa: 没有那个文件或目录
中括号[]
中括号内为字符组合,代表字符组合中的任意一个
特殊符号&&和||
command1;commond2
commond1 && commond2
commond1 || commond2
使用;时,不管commond1是否执行成功,都会执行commond2。
使用&&时,只有commond1执行成功后,commond2才会执行,否则commond2不执行
使用||时,commond1执行成功后则commond2不执行,否则执行commond2,即commond1和commond2中总有一条命令会执行
[root@lizhipeng01 ~]# rm -f test*
[root@lizhipeng01 ~]# touch test1 test3
[root@lizhipeng01 ~]# ls test2 && touch test2
ls: 无法访问test2: 没有那个文件或目录
[root@lizhipeng01 ~]# ls test2
ls: 无法访问test2: 没有那个文件或目录
只有当ls test2成功执行后,才会执行touch test2。因为test2不存在,ls test2没有执行成功,所以&&后面的touch test2并没有执行。
[root@lizhipeng01 ~]# ls test2 || touch test2
ls: 无法访问test2: 没有那个文件或目录
[root@lizhipeng01 ~]# ls test*
test1 test2 test3
若ls test2执行不成功,则会执行touch test2。因为test2不存在,所以ls test2没有执行成功,转而执行||后面的touch test2,所以增加了test2这个文件。