shell编程1
一、正则表达式
正则表达式和通配符的区别:
正则表达式是用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名。
1、基础正则表达式
* 前一个字符匹配0次或任意多次 例如:grep "aa*" test.txt 在test.txt文档中匹配包含a的行,grep "aaaa*" test.txt 至少包含3个a
. 匹配除了换行符外的任意一个字符 例如:grep “s..d” test.txt 匹配文件中的said,sood等任意字符 说明:“.*”表示匹配所有内容
^ 匹配行首。例如:^hello会匹配以hello开头的行
$ 匹配行尾。例如:hello$会匹配以hello结尾的行 说明:"^$" 匹配空白行,去除空白行 grep -v "^$"
[] 匹配括号中指定的任意一个字符,只匹配一个字符。如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字母和一位数字构成的两位字符。
[^ ] 匹配除括号中的字符以外的任意一个字符,例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字母
\ 转义符
\{n\} 表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码
\{n,\} 表示其前面的字符出现不小于n次。
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\}匹配6到8位的小写字母
2、扩展正则表达式(不常用)
+:前一个字符匹配1次或任意多次。例如:“go+gle”会匹配“gogle”、“google”等,当然如果“o”有更多个,也能匹配
?:前一个字符匹配0次或1次。例如:“colou?r”可以匹配“colour”或“color”
|:匹配两个或多个分支选择。例如:”was|his“会匹配既包含”was“的行,也匹配包含”his“的行
():匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组成的大字符。如:“(dog)+”会匹配“dog”、“dogdog”、“dogdogdog”等,因为被()包含的字符会当成一个整体。但“hello (world|earth)”会匹配“hello world”及“hello earth”
3、正则实例:
匹配邮箱():
[0-9a-zA-Z_][0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+)(1,3)
解释:
[0-9a-zA-Z_] 表示数字、小写字母、大写字母或者_中的任意字符
+ 前一个字符匹配1次或任意多次
\. 将.转成普通字符串
IP地址匹配:
“^(([0-9]\.)|([1-9][0-9]\.)|(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-9]\.)|([1-9][0-9]\.)|(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.))$”
4、字符串截取和替换命令
(1)cut列提取命令
cut [选项] 文件名
选项:
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列
-c 字符范围(了解):不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。
“n-”表示从第n个字符到行尾,“n-m”从第n个字符到第m个字符,“-m”表示从第1个字符到第m个字符。
注意:cut命令的默认分割符是制表符,及“tab”键,不支持空格。
举例:提取第几列的内容
若要提取多列,只要列号直接用”,“分开:
cut -f 2,3 student.txt
指定分隔符:
cut -d ":" -f 1,3 student.txt
以“:”作为分隔符,提取student.txt文件的第一列和第三列。
(2)printf格式化输出
printf ‘输出类型输出格式‘ 输出内容
输出类型:
%ns:输出字符串。n是数字指代输出几个字符
%ni:输出整数。n是数字指代输出几个数字
%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。
输出格式:
\n:换行
\r:回车,也就是Enter键
\t:水平输出退格键,也就是Tab键
\v:垂直输出退格键,也就是Tab键
使用printf命令输出文件内容
会发现很乱,不是我们想要的。
printf命令,需要制定输出格式。若不指定输出格式,则会把所有输出内容连在一起输出。
如果不想把成绩当成字符串输出,而是按照整型和浮点型输出,则如下这样:
这里报错是因为第一行不支持整型输出,没关系,后面再介绍。
(3)awk基本使用
awk ‘条件1{动作1} 条件2{动作2}...‘ 文件名
条件:
动作:
格式化输出
流程控制语句
举例:
如果第二字段中输入包含有“Sc”字符,则打印第六字段数据:
注意:在awk中,使用"//"包含的字符串,awk命令才会查找。
awk内置变量:
举例:
cat /etc/passwd |grep "/bin/bash" | awk ‘BEGIN{FS=":"} {printf $1 "\t" $3 "\t 行号: " NR "\t 字段数: " NF "\n"}‘
{开始执行{分隔符是“:”} {输出第一字段和第三字段 输出行号(NR值)字段数(NF值)}