UNIX Shell编程 学习笔记(二)

时间:2022-05-31 00:15:23

UNIX Shell的正则表达式

匹配任何单个字符:句点(.)比如:r.表示匹配r后跟任一个字符的模式。

匹配行首符号:^比如:^George表示匹配以George开头的行。

匹配行尾符号:$比如:contents$表示匹配在行尾的字符串contents。/^the/ #搜索以the开头的行

匹配字符组之一:[...]结构
/the/ 匹配含the的行
[tT]he 匹配the或The
[0-9] 匹配数字
[a-z] 匹配小写字母
[a-zA-Z] 匹配大小写字母
[^A-Z] 匹配除大些字母以外的任何字符

匹配零个到若干个字符:星号(*)
匹配精确数目的字符串:XX* 指匹配至少一个连续的X;XXX* 指匹配至少两个连续的X
/{min,max/} 其中:min表示重复的最小次数,max表示最大次数。

保存匹配的字符串/(.../):把字符包括在前加反斜杠的小括号中,可以捕获正则表达式匹配的字符串。

捕获的字符串存储在编号为1到9的寄存器中。

cut命令
可以从数据文件或者命令的输出中截取所需的数据域。
命令格式:cut -cchars file
chars表示要截取哪些文字,可以是数字。file表示文件,如果不指定file,cut从标准输出读入输入,即可把cut命令作为管道的过滤器。
cut -c1-8表示把输入的每一行的第1到8个字符截取出来,并作为标准输出。

cut命令的-d和-f选项,命令:cut -ddchar -ffields file
dchar是数据中分隔各字段的分隔符,fields表示要从文件file中截取的字段
cut的-f选项是对应制表符。
paste命令:与cut相反,它可以把多行合并在一起。
使用-d选项——则不使用制表符分隔各行的多个字符;-s选项,告诉paste把同一文件中的行粘贴在一起。
sed是用来编辑数据的程序,指流编辑器,sed不能用于交互。
格式:sed command file
command是作用于指定文件file各行的跟ed同样风格的命令。如未指定文件,则把标准输入作为处理对象。
sed的-n选项,提取文件的指定行。
sed命令汇总示例:
——————————————————————————————————————
sed '5d'    删除第5行
sed '/[Tt]est/d'    删除包含test和Test的行
sed -n'20,25p' text    显示text文件的第20行到25行
sed '1,10s/unix/UNIX/g' intro    把intro文件前10行的unix改为UNIX
sed '/jan/s/-1/-5/'    把所有包含jan的行中的第一个-1改为-5
sed 's/...//' data    删除data文件每一行的前3个字符
sed 's/...$//' data    删除data文件每一行的最后3个字符
sed -n 'l' text    显示text文件的所有行,并把所有不可打印字符显示为/nn,制表符显示为/t

——————————————————————————————————————--

过滤器tr用来转换来自标准输入的字符。格式:tr from-chars to-chars
from-chars 和 to-chars 是一个或多个字符。

-s选项,用于压缩to-chars中重复的字符。

-d选项,用于删除输入流中的字符,格式为:tr -d from-chars
tr命令综合实例:
————————————————————————————————————
tr 'X' 'x' 把所有大些X转换为小写x
tr '()' '{}' 把所有小括号换为大括号
tr '[A-Z]' '[N-ZA-M]' 把A-M字母转换为N-Z,把N-Z转换为A-M
tr -d '/14' 删除所有换页字符
tr -d '[0-9]' 删除所有数字 
————————————————————————————————————
grep命令可以从一个或多个文件中搜索特定的字符串模式,格式为:grep pattern files
例如,从文件intro找出含Unix的行:
[root@localhost programs]# grep Unix intro
-v选项,显示不包含的行
-l选项,只给出包含给定模式的文件列表,而不给出文件中的匹配行。
-n选项,文件中符合指定模式的每一行前都加上该行在文件中的相对行号。
sort命令
-u选项,在输出结果中去除重复的行

-r选项,颠倒排序顺序

sort的输出重定向:可用-o选项,也可用>符号
[root@localhost programs]# sort -r names > sorted_name1
[root@localhost programs]# sort names -o sorted_name2

-n选项,按第一列进行排序.

变量:UNIX Shell允许把值存在变量中。要把值存入一个变量,只需写出变量名,后面紧跟一个等号,再紧跟变量值。variable=value切忌中间含空格。Shell中没有任何数据类型的概念,变量值通通认为是字符串。
变量还能传值,如下:
[root@localhost programs]# value1=10
[root@localhost programs]# value2=$value1
[root@localhost programs]# echo $value2
10

POSIX标准Shell为变量整数运算提供了一套机制,称为算术扩展。格式为:$((expression))

其中,expression是由变量和运算符构成的算是表达式。
[root@localhost programs]# result=$((i>=0&&i<100))如果表达式结果为真,result赋值1;否则赋值0.
单引号和双引号:单引号告诉Shell忽略所包含的所有特殊字符。
[root@localhost programs]# echo '$file'
$file
[root@localhost programs]# echo '*'
*
而双引号只要求忽略大多数。在双引号中,有三种特殊字符不会被忽略:
1)美元符号$;2)反引号`;3)反斜杠/
[root@localhost programs]# x=*
[root@localhost programs]# echo '$x'
$x
[root@localhost programs]# echo "$x"
*
可见,在双引号内部也进行了变量名替换。

反斜杠

[root@localhost programs]# echo />
>
[root@localhost programs]# x=*
[root@localhost programs]# echo /$x
$x

可见,反斜杠进行了转义。反斜杠还可用于换行。
命令替换:指Shell能够将一个命令的标准输出插入一个命令行中任何位置的功能。
Shell有两种方法做命令替换:1)用反引号;2)使用$(...)结构括起来。

反引号:其目的不是防止Shell处理某些字符,二是要告诉Shell执行括起来的命令,并将该命令的标准输出插在命令行中的这个位置。POSIX标准Shell支持新的$(...)命令替换结构,格式为:$(command)
此结构比使用反引号要好,原因如下:
1)复杂的命令中组合使用正、反引号会很难看懂,而且在某些字体显示下难以区分;2)$(...)结构容易嵌套。

命令替换可嵌套,如下:
[root@localhost programs]# filename=/tools/test/programs
[root@localhost programs]# ls $filename
addresses data intro mon nu phonebook sorted_name2 tally wbb2 writeback
collect data2 lotsapaces names numbers sorted_name1 stats temp wbx
[root@localhost programs]# firstchar=$(echo $filename | cut -c1)
[root@localhost programs]# echo $firstchar
/
[root@localhost programs]# echo $filename
/tools/test/programs
[root@localhost programs]# echo $filename | cut -c1
/
[root@localhost programs]# filename=$(echo $filename | tr "$firstchar" "^")
[root@localhost programs]# echo $filename
^tools^test^programs