shell基础知识(二)

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 a    1    [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的区别

更多资料:
sort命令的几个细节问题
shell脚本中echo显示内容带颜色
Linux特殊符号大全

猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/80549578