标签:8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下
8.10 shell特殊符号cut命令
8.11 sort_wc_uniq命令
8.12 tee_tr_split命令
8.13 shell特殊符号下
# 8.10 shell 特殊符_cut命令
---
- * 任意个任意字符
- ?任意一个字符
- 井号#注释字符 写命令的时候前面加一个#,那么这条命令就不生效,包括shell脚本里面也是,前面加个#表示这一行不生效,可以加一些注释说明的文字
```
<root@aminglinux-01 ~># #ls a.txt
<root@aminglinux-01 ~>##dkdkdkd
<root@aminglinux-01 ~>#
```
- \ 脱义字符
```
<root@aminglinux-01 ~>#a=1
<root@aminglinux-01 ~>#b=2
<root@aminglinux-01 ~>#c=$a$b
<root@aminglinux-01 ~>#echo $c
12
<root@aminglinux-01 ~>#
```
- 现在就想让这个c=这个$a$b 的字符串,之前给的方法是用单引号,还可以使用\脱义字符
```
<root@aminglinux-01 ~>#c=‘$a$b^C
<root@aminglinux-01 ~>#c=\$a\$b
<root@aminglinux-01 ~>#echo $c
$a$b
<root@aminglinux-01 ~>#
```
- | 管道符

- cut命令的用法
```
<root@aminglinux-01 ~>#cat /etc/passwd |head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
<root@aminglinux-01 ~>#cat /etc/passwd |head -2 |cut -d ":" -f 1
root
bin
<root@aminglinux-01 ~>#cat /etc/passwd |head -2 |cut -d ":" -f 1,2
root:x
bin:x
<root@aminglinux-01 ~>#cat /etc/passwd |head -2 |cut -d ":" -f 1-3
root:x:0
bin:x:1
<root@aminglinux-01 ~>#
<root@aminglinux-01 ~>#cat /etc/passwd |head -2 |cut -c 4
t
:
<root@aminglinux-01 ~>#
```
- 针对这前俩行,切割,-d指定分隔符,-f指定段号,-c指定第几个字符 截取它的第一段用 -f 1 ,截取1 2 段就用 -f 1,2 用逗号隔开,1-3段就用-f 1-3 , cut 截取 -c 4 截取第四个字符
# 8.11 sort wc uniq命令
## sort排序
- 默认sort排序按照 阿斯玛ASCII排序
```
[root@aminglinux-01 ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
aming:x:1000:1005::/home/aming:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:997:995::/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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
saslauth:x:996: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:192:192:systemd Network Management:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/aming111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
[root@aminglinux-01 ~]#
```
- 先做个实验,取/etc/passwd/的前10行 追加到 1.txt下
```
[root@aminglinux-01 ~]# head /etc/passwd >> 1.txt
[root@aminglinux-01 ~]# vim 1.txt
1.txt
2.txt
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
2222222aaaaaaa
488888888888asldkfas
*slkdf
222111
223333
22aaa
<
>
{
]
~
~
~
~
~
~
:wq
```
- sort 1.txt 看下
```
[root@aminglinux-01 ~]# vim 1.txt
[root@aminglinux-01 ~]# sort 1.txt
<
>
]
{
1.txt
222111
2222222aaaaaaa
223333
22aaa
2.txt
488888888888asldkfas
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
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
*slkdf
sync:x:5:0:sync:/sbin:/bin/sync
[root@aminglinux-01 ~]#
```
- 看下,特殊符号排在前面,然后是数字,然后是字母,然后是*,这就是sort
- sort -n 会以数字去排序,字母和特殊符号 默认情况下都默认是0
```
[root@aminglinux-01 ~]# sort -n 1.txt
<
>
]
{
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
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
*slkdf
sync:x:5:0:sync:/sbin:/bin/sync
1.txt
2.txt
22aaa
222111
223333
2222222aaaaaaa
488888888888asldkfas
[root@aminglinux-01 ~]#
```
- sort -nr 加上r 就会反序排序
```
[root@aminglinux-01 ~]# sort -nr 1.txt
488888888888asldkfas
2222222aaaaaaa
223333
222111
22aaa
2.txt
1.txt
sync:x:5:0:sync:/sbin:/bin/sync
*slkdf
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
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
{
]
>
<
[root@aminglinux-01 ~]#
```
- sort -t 分隔符 -kn1/-kn1,n2 用的比较少了解下即可
- wc -l 统计行数
- wc -m 统计字符数
- wc -w 统计词
```
[root@aminglinux-01 ~]# wc -l 1.txt
22 1.txt
[root@aminglinux-01 ~]# wc -m 1.txt
468 1.txt
[root@aminglinux-01 ~]#
```
- 先做一个实验vim 2.txt 在里面写入 123 abc
```
[root@aminglinux-01 ~]# vim 2.txt
123
abc
~
:wq
[root@aminglinux-01 ~]# vim 2.txt
[root@aminglinux-01 ~]# wc -m 2.txt
8 2.txt
[root@aminglinux-01 ~]# cat -A 2.txt
cat -A 显示所有内容 所以有2个隐藏的$(换行符$) ,总共就是8个字符
123$
abc$
[root@aminglinux-01 ~]#
```
- wc -w统计词 以空白字符 作为分隔符
```
[root@aminglinux-01 ~]# wc -w 2.txt
2 2.txt
[root@aminglinux-01 ~]#
2个词 123 是一个词 abc 是一个词
[root@aminglinux-01 ~]# vim 2.txt
123
abc 1111,222
[root@aminglinux-01 ~]# vim 2.txt
[root@aminglinux-01 ~]# wc -w 2.txt
3 2.txt
[root@aminglinux-01 ~]# cat 2.txt
123
abc 1111,222
[root@aminglinux-01 ~]#
```
- uniq命令
```
[root@aminglinux-01 ~]# vi 2.txt
123
abc 1111,222
123
abc
1
2
1
[root@aminglinux-01 ~]# vi 2.txt
[root@aminglinux-01 ~]# cat 2.txt
123
abc 1111,222
123
abc
1
2
1
[root@aminglinux-01 ~]#
下面来用nqia
[root@aminglinux-01 ~]# uniq 2.txt
123
abc 1111,222
123
abc
1
2
1
没有任何变化?
```
- 再次编辑vim 2.txt 把内容 2放到下面去
```
[root@aminglinux-01 ~]# vim 2.txt
[root@aminglinux-01 ~]# cat 2.txt
123
abc 1111,222
123
abc
1
1
2
[root@aminglinux-01 ~]# uniq 2.txt
123
abc 1111,222
123
abc
1
2
[root@aminglinux-01 ~]#
```
- 现在去重了,原来是 1 1 2 现在是 1 2,所以去重是条件的,需要先排序再去重
```
[root@aminglinux-01 ~]# sort 2.txt 先排序
1
1
123
123
2
abc
abc 1111,222
[root@aminglinux-01 ~]# sort 2.txt |uniq 先排序再管道符去重
1
123
2
abc
abc 1111,222
[root@aminglinux-01 ~]#
```
```
[root@aminglinux-01 ~]# sort 2.txt |uniq -c
uniq -c 统计重复次数
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]#
```
- [x] srot 、cut、uniq、cat、less、more、head、tail、wc等等会对文件做一些操作,但是并不会更改文件的内容
# 8.12 tee tr split 命令
- tee 和 输出重定向很类似
```
[root@aminglinux-01 ~]# sort 2.txt |uniq -c > a.txt
[root@aminglinux-01 ~]# cat a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]#
[root@aminglinux-01 ~]# sort 2.txt |uniq -c | tee a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]#
```
- 可以先清空a.txt里的内容 >a.txt 就是清空
```
[root@aminglinux-01 ~]# >a.txt
[root@aminglinux-01 ~]# cat a.txt
[root@aminglinux-01 ~]# sort 2.txt |uniq -c | tee a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]#
```
- tee -a 追加 等同于>>
```
[root@aminglinux-01 ~]# sort 2.txt |uniq -c | tee -a a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]# cat a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@aminglinux-01 ~]#
```
- tr 命令 tr 是用来替换字符的 tr "a" "b", 大小写替换tr ‘[a-z]‘ ‘[A-Z]‘
```
[root@aminglinux-01 ~]# echo "aminglinux" |tr ‘a‘ ‘A‘
Aminglinux
[root@aminglinux-01 ~]#
[root@aminglinux-01 ~]# echo "aminglinux" |tr ‘[al]‘ ‘[AL]‘
AmingLinux
全部换成大写
[root@aminglinux-01 ~]# echo "aminglinux" |tr ‘[a-z]‘ ‘[A-Z]‘
AMINGLINUX
[root@aminglinux-01 ~]#
改成数字
[root@aminglinux-01 ~]# echo "aminglinux" |tr ‘[a-z]‘ ‘1‘
1111111111
[root@aminglinux-01 ~]#
```
- split 切割,一个大文件切割成小文件 -b 大小 (默认单位字节),-l 行数
[root@aminglinux-01 ~]# split -b 100M bigfile^C
[root@aminglinux-01 ~]# split -l 1000 bigfile^C
```
[root@aminglinux-01 ~]# find /etc/ -type f -name "*conf" -exec cat {} >> a.txt \;
[root@aminglinux-01 ~]# du -sh a.txt
256K a.txt
[root@aminglinux-01 ~]# find /etc/ -type f -name "*conf" -exec echo {} >> a.txt \;
[root@aminglinux-01 ~]# du -sh a.txt
448K a.txt
[root@aminglinux-01 ~]# ls
111 1_heard.txt 1.txt 1.txt.bak 2.txt 3.txt anaconda-ks.cfg.1 biji.txt
123 1_sorft.txt 1.txt~ 234 2.txt.bak 4.txt bb.txt test
[root@aminglinux-01 ~]#
[root@aminglinux-01 ~]# mv a.txt test/
[root@aminglinux-01 ~]# cd test
[root@aminglinux-01 test]# ls
a.txt
[root@aminglinux-01 test]#
```
- split 分割成1000字节一个文件
```
[root@aminglinux-01 test]# split -b 1000 a.txt
[root@aminglinux-01 test]# ls
a.txt xan xbb xbp xcd xcr xdf xdt xeh xev xfj xfx xgl xgz xhn xib xip xjd xjr
xaa xao xbc xbq xce xcs xdg xdu xei xew xfk xfy xgm xha xho xic xiq xje xjs
xab xap xbd xbr xcf xct xdh xdv xej xex xfl xfz xgn xhb xhp xid xir xjf xjt
xac xaq xbe xbs xcg xcu xdi xdw xek xey xfm xga xgo xhc xhq xie xis xjg xju
xad xar xbf xbt xch xcv xdj xdx xel xez xfn xgb xgp xhd xhr xif xit xjh xjv
xae xas xbg xbu xci xcw xdk xdy xem xfa xfo xgc xgq xhe xhs xig xiu xji xjw
xaf xat xbh xbv xcj xcx xdl xdz xen xfb xfp xgd xgr xhf xht xih xiv xjj xjx
xag xau xbi xbw xck xcy xdm xea xeo xfc xfq xge xgs xhg xhu xii xiw xjk xjy
xah xav xbj xbx xcl xcz xdn xeb xep xfd xfr xgf xgt xhh xhv xij xix xjl xjz
xai xaw xbk xby xcm xda xdo xec xeq xfe xfs xgg xgu xhi xhw xik xiy xjm xka
xaj xax xbl xbz xcn xdb xdp xed xer xff xft xgh xgv xhj xhx xil xiz xjn
xak xay xbm xca xco xdc xdq xee xes xfg xfu xgi xgw xhk xhy xim xja xjo
xal xaz xbn xcb xcp xdd xdr xef xet xfh xfv xgj xgx xhl xhz xin xjb xjp
xam xba xbo xcc xcq xde xds xeg xeu xfi xfw xgk xgy xhm xia xio xjc xjq
[root@aminglinux-01 test]# du -sh
1.3M .
[root@aminglinux-01 test]# du -sh *
256K a.txt
4.0K xaa
4.0K xab
4.0K xac
4.0K xad
4.0K xae
4.0K xaf
4.0K xag
... 这里为了节约空间,省略了很多
4.0K xjw
4.0K xjx
4.0K xjy
4.0K xjz
4.0K xka
[root@aminglinux-01 test]# du -sb *
260054 a.txt
1000 xaa
1000 xab
1000 xix
1000 xiy
1000 xiz
... 这里为了节约空间,省略了很多
1000 xjt
1000 xju
1000 xjv
1000 xjw
1000 xjx
1000 xjy
1000 xjz
54 xka
[root@aminglinux-01 test]# ls
a.txt xan xbb xbp xcd xcr xdf xdt xeh xev xfj xfx xgl xgz xhn xib xip xjd xjr
xaa xao xbc xbq xce xcs xdg xdu xei xew xfk xfy xgm xha xho xic xiq xje xjs
xab xap xbd xbr xcf xct xdh xdv xej xex xfl xfz xgn xhb xhp xid xir xjf xjt
xac xaq xbe xbs xcg xcu xdi xdw xek xey xfm xga xgo xhc xhq xie xis xjg xju
xad xar xbf xbt xch xcv xdj xdx xel xez xfn xgb xgp xhd xhr xif xit xjh xjv
xae xas xbg xbu xci xcw xdk xdy xem xfa xfo xgc xgq xhe xhs xig xiu xji xjw
xaf xat xbh xbv xcj xcx xdl xdz xen xfb xfp xgd xgr xhf xht xih xiv xjj xjx
xag xau xbi xbw xck xcy xdm xea xeo xfc xfq xge xgs xhg xhu xii xiw xjk xjy
xah xav xbj xbx xcl xcz xdn xeb xep xfd xfr xgf xgt xhh xhv xij xix xjl xjz
xai xaw xbk xby xcm xda xdo xec xeq xfe xfs xgg xgu xhi xhw xik xiy xjm xka
xaj xax xbl xbz xcn xdb xdp xed xer xff xft xgh xgv xhj xhx xil xiz xjn
xak xay xbm xca xco xdc xdq xee xes xfg xfu xgi xgw xhk xhy xim xja xjo
xal xaz xbn xcb xcp xdd xdr xef xet xfh xfv xgj xgx xhl xhz xin xjb xjp
xam xba xbo xcc xcq xde xds xeg xeu xfi xfw xgk xgy xhm xia xio xjc xjq
[root@aminglinux-01 test]# rm -f x*
[root@aminglinux-01 test]# ls
a.txt
[root@aminglinux-01 test]#
```
指定每个100k split -b (默认大小是字节)
```
[root@aminglinux-01 test]# split -b 100k a.txt
[root@aminglinux-01 test]# ls
a.txt xaa xab xac
[root@aminglinux-01 test]# du -sh *
256K a.txt
100K xaa
100K xab
56K xac
[root@aminglinux-01 test]# rm -f x*
[root@aminglinux-01 test]# split -b 100k abc
split: 无法打开"abc" 读取数据: 没有那个文件或目录
[root@aminglinux-01 test]# split -b 100k abc.
split: 无法打开"abc." 读取数据: 没有那个文件或目录
[root@aminglinux-01 test]# split -b 100k a.txt abc
[root@aminglinux-01 test]# ls
abcaa abcab abcac a.txt
[root@aminglinux-01 test]# rm -f abc* 指定名字
[root@aminglinux-01 test]# split -b 100k a.txt abc.
[root@aminglinux-01 test]# ls
abc.aa abc.ab abc.ac a.txt
[root@aminglinux-01 test]# rm -f abc*
[root@aminglinux-01 test]#
```
- 除了指定大小之外,还可以指定行 split -l
```
[root@aminglinux-01 test]# split -l 1000 a.txt
[root@aminglinux-01 test]# ls
a.txt xaa xab xac xad xae xaf xag
[root@aminglinux-01 test]# ls -l
总用量 520
-rw-r--r--. 1 root root 260054 8月 20 17:45 a.txt
-rw-r--r--. 1 root root 44712 8月 20 18:15 xaa
-rw-r--r--. 1 root root 44151 8月 20 18:15 xab
-rw-r--r--. 1 root root 37982 8月 20 18:15 xac
-rw-r--r--. 1 root root 39801 8月 20 18:15 xad
-rw-r--r--. 1 root root 35102 8月 20 18:15 xae
-rw-r--r--. 1 root root 39350 8月 20 18:15 xaf
-rw-r--r--. 1 root root 18956 8月 20 18:15 xag
[root@aminglinux-01 test]# wc -l * 查看行数
6601 a.txt
1000 xaa
1000 xab
1000 xac
1000 xad
1000 xae
1000 xaf
601 xag
13202 总用量
[root@aminglinux-01 test]#
```
# 8.13 shell特殊符号下

- $表示变量前缀,!$组合,正则里面表示行尾
- ;多条命令写到一行,用分号分割
```
[root@aminglinux-01 ~]# ls 1.txt; wc -l 2.txt
1.txt
7 2.txt
[root@aminglinux-01 ~]#
```
- ~表示用户的家目录,后面正则表达式 表示匹配符
- &放到命令后面,会把命令丢到后台
- > ,>> , 2> ,2>> , &>
- []指定字符中的一个[0-9],[a-zA-Z],[abc]
-||和 && 用于命令之间
1. ||表示俩条命令之间,
如果前面的命令执行不成功,就会执行第二条命令,或1命令或2命令
如果前面的命令1执行成功了,就不再执行后面的命令2。
```
[root@aminglinux-01 ~]# ls la.txt || wc -l 2.txt
ls: 无法访问la.txt: 没有那个文件或目录
7 2.txt
[root@aminglinux-01 ~]# ls 1.txt || wc -l 2.txt
1.txt
[root@aminglinux-01 ~]#
```
2. && 正好相反
如果前面的命令错了,就不再执行后面的命令。
只有前面的命令成功了,才会执行后面的命令。
```
[root@aminglinux-01 ~]# ls la.txt && wc -l 2.txt
ls: 无法访问la.txt: 没有那个文件或目录
[root@aminglinux-01 ~]# ls 1.txt && wc -l 2.txt
1.txt
7 2.txt
[root@aminglinux-01 ~]#
```
- 举例
```
[root@aminglinux-01 ~]# [ -d aminglinux ] || mkdir aminglinux
- [ -d aminglinux ] || mkdir aminglinux
如果aminglinux这个目录不存在就创建aminglinux目录,
[root@aminglinux-01 ~]# ls
111 1_heard.txt 1.txt 1.txt.bak 2.txt 3.txt aminglinux bb.txt test
123 1_sorft.txt 1.txt~ 234 2.txt.bak 4.txt anaconda-ks.cfg.1 biji.txt
[root@aminglinux-01 ~]# [ -d aminglinux ] && mkdir aminglinux
如果目录aminglinux 存在,再去创建目录aminglinux,
mkdir: 无法创建目录"aminglinux": 文件已存在
[root@aminglinux-01 ~]# [ -d aminglinux ] || mkdir aminglinux
如果这个目录已经存在,就不会执行后面的命令
[root@aminglinux-01 ~]#
```
# 拓展
- [x] 相关测验题目:http://ask.apelearn.com/question/5437
1. source exec 区别 http://alsww.blog.51cto.com/2001924/1113112
2. Linux特殊符号大全 http://ask.apelearn.com/question/7720
3. sort并未按ASCII排序 http://blog.csdn.net/zenghui08/article/details/79389758.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下
标签:8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下
原文地址:http://ch71smas.blog.51cto.com/13090095/1962042