基础正则表达式
正则表达式和通配符的区别(Shell中)
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配,grep、awk、sed等命令可以支持正则表达式
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能用shell自己的通配符来进行匹配了b
基础正则表达式
元字符 |
作用 |
* |
前一个字符匹配0次或任意多次 |
. |
匹配除了换行符外任意一个字符 |
^ |
匹配行首 |
$ |
匹配行尾 |
[] |
匹配中括号中指定的任意一个字符,只匹配一个字符 |
[^] |
匹配除中括号以外的任意一个字符 |
\ |
转义符。用于取消特殊符号的含义 |
\ { n\ } |
表示其前面的字符出现不小于n次 |
\ {n, \ } |
表示其前面的字符出现不小于n次 |
\ {n, m\ } |
表示其前面的字符至少出现n次,最多出现m次 |
- grep “a*” test_rule.txt #匹配所有内容,包括空白行
- grep “aa*” test_rule.txt #匹配一个至少包含有一个a的行
- grep “aaa*” test_rule.txt # 匹配最少包含两个连续a的字符串
字符截取命令
cut字段提取指定列 cut [选项] 文件名
- -f 列号 - 提取第几列
- -d 分割符 - 按照指定分隔符分割列,默认使用制表符
- 文件事先默认需要用tab制表符分隔,不能用空格分隔
- cut -f 2 student.txt
- cut -f 2,3 student.txt # 提取第2和第3列
- cut -d “:” - f 1,3 student.txt # 指定分隔符为":"
printf格式化打印命令 printf ‘输出类型输出格式’ 输出内容
- %ns - 输出字符串。n是数字指代输出几个字符
- %ni - 输出整数。n是数字指代输出几个数字
- %m.nf - 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数
- printf ‘%s %s %s\n’ 1 2 3 4 5 6
- printf ‘%s\t %s\t %s\t %s\t %s\t %s\t \n’ $(cat student.txt) # 调整格式输出
awk列截取命令 awk '条件1{动作1} 条件2{动作2}… ’ 文件名
条件:一般使用变量关系表达式作为条件
- x > 10 - 判断变量x是否大于10
- x >= 10 - 大于等于
- x <= 10 - 小于等于
- BEGIN - 在所有动作之前进行相关操作
动作
示例
- awk ‘{printf $2 “\t” $6"\n"}’ student.txt # 输出第二列和第六列内容,用制表符分隔
- $0代表整行本身
- 可以与管道符结合使用,如df - h | awk ‘print $1 “\t” $3’ # print自动输出换行符,只能在awk命令中使用
- cat student.txt | grep -v Name | awk ‘$6 >= 87 {printf $2 “\n”}’
sed命令 sed [选项] ‘[动作]’ 文件名
- sed是一种几乎包括在所有UNIX平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令
- vi只能修改文件,不能直接修改命令的结果;sed可以从管道符接收数据,而不用先写到文件中
选项
- -n - 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕
- -e - 允许对输入数据应用多条sed命令编辑
- -i - 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作
动作 |
作用 |
a \ |
追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用" \ "代表数据未完结 |
c \ |
行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用" \ "代表数据未完结 |
i \ |
插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用" \ "代表数据未完结 |
d |
删除。删除指定的行 |
p |
打印。输出指定的行 |
s |
字串替换。用一个字符串替换另外一个字符串。格式为"行范围s/旧字串/新字串/g" |
示例
- sed -n ‘2p’ student.txt # 查看文件的第二行
- sed ‘2,4d’ student.txt # 删除第二行到第四行的数据,但不修改文件本身
- sed ‘2a hello’ student.txt # 在第二行后追加hello
- sed ‘2i hello \ world’ student.txt # 在第二行前插入两行数据,其中第一行是’hello’,第二行是’world’
字符处理命令
sort排序命令 sort [选项] 文件名
- -f - 忽略大小写
- -n - 以数值型进行排序,默认使用字符串型排序
- -r - 反向排序
- -t - 指定分隔符,默认分隔符是制表符
- -k n[, m] - 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
- sort /etc/passwd
wc统计命令 wc [选项] 文件名
- -l - 只统计行数
- -w - 只统计单词数
- -m - 只统计字符数
条件判断(用于计算机判断)
按照文件类型进行判断(具体见参考书)
常用类型
测试选项 |
作用 |
-d 文件 |
判断该文件是否存在,并且是否为目录文件(是目录为真) |
-e 文件 |
判断该文件是否存在(存在为真) |
-f 文件 |
判断该文件是否存在,并且是否为普通文件(是普通文件为真) |
两种判断格式
- test -e /root/install.log
- [ -e /root/install.log ](注意有空格)
示例
- [-d/root] && echo “yes” || echo “no” # 第一个判断命令如果正确执行,则打印”yes", 否则打印"no"
两个文件之间进行比较
测试选项 |
作用 |
文件1 -nt 文件2 |
判断文件1的修改时间是否比文件2的新(如果新则为真) |
文件1 -ot 文件2 |
判断文件1的修改时间是否比文件2的旧(如果旧则为真) |
文件1 -ef 文件2 |
判断文件1是否和文件2的Inode号一致,两个文件是否为同一个文件。可以用来判断是否为硬链接 |
两个整数之间比较
测试选项 |
作用 |
整数1 -eq 整数2 |
判断整数1是否和整数2相等(相等为真) |
-ne |
不相等 |
-gt |
大于 |
-lt |
小于 |
-ge |
大于等于 |
-le |
小于等于 |
两个字符串的判断
测试选项 |
作用 |
-z 字符串 |
判断字符串是否为空 |
-n 字符串 |
判断字符串是否为非空 |
字串1 == 字串2 |
判断字串1和字串2是否相等 |
字串1 != 字串2 |
判断字串1和字串2是否不等 |
示例
- [ “$aa” == “bb” ] && echo “yes” || echo “no” # 判断两个变量的值是否相等
多重条件判断(与或非)
测试选项 |
作用 |
判断1 -a 判断2 |
逻辑与 |
判断1 -o 判断2 |
逻辑或 |
!判断 |
逻辑非 |
流程控制
if语句
if [ 条件判断式 ];then
程序
else
程序
fi
if [ 条件判断式 ];
then
程序
else
程序
fi
case语句
for语句
while语句