一、特殊符号
1、引号系列
对于Linux大部分命令通用,四剑客目前单独记忆与使用即可
引号 | 含义 |
---|---|
单引号 | 所见即所得,单引号里面的内容会原封不动输出 |
双引号 | 和单引号类似,对双引号里面的特殊符号会进行解析,对于{}花括号(通配符)没有解析 |
不加引号 | 和双引号类似,额外支持通配符(匹配文件)*.log{1…10} |
反引号 | 优先执行,先执行反引号里面的命令 |
#单引号
[root@yunwei ~]# echo '`hostname` test $(whoami) $UID {1..5}'
`hostname` test $(whoami) $UID {1..5}
#双引号
[root@yunwei ~]# echo "`hostname` test $(whoami) $UID {1..5}"
yunwei test root 0 {1..5}
#不加引号
[root@yunwei ~]# echo `hostname` test $(whoami) $UID {1..5}
yunwei test root 0 1 2 3 4 5
hostname
表示执行hostname命令$(whoami)
表示执行whoami命令$UID
表示取出当前用户的uid{1..5}
输出12345
2、重定向符号系列
重定向符号 | 含义 | 应用场景 |
---|---|---|
> 或 1> | 标准输出重定向: 先清空文件,然后写入 | 大部分情况下先清空的时候可以使用创建文件. |
>> 或 1>> | 标准输出追加重定向:直接写入到文件未尾. | 修改配置文件,表示追加的时候 |
2> | 标准错误输出重定向:先清空文件,然后写入错误信息. | 较少单独用,一般用于获取所有输出 |
2>> | 标准错误追加输出重定向:直接把错误写入到文件未尾. | 较少单独用,一般用于获取所有输出 |
`>>1.log 2>&1 | 无论对错都把结果写入到文件中 | 比较常用,定时任务,脚本中常用 |
`&>>1.log | 无论对错都把结果写入到文件中 | 比较常用,定时任务,脚本中常用 |
< 或 0< | 标准输入重定向 | 很少用,搭配某一个命令用xargs,tr |
<< 或 0<< | 标准输入追加重定向 | 与cat搭配使用表示文件写入多行内容 |
- 标准输出重与标准错误输出
#标准输出重定向
[root@yunwei ~]# echo 123 >> test.txt
[root@yunwei ~]# cat test.txt
123
#标准错误重定向
[root@yunwei ~]# eco 456 2>> test.txt
[root@yunwei ~]# cat test.txt
123
-bash: eco: 未找到命令
- 同时记录正常输出与错误输出
#选路,如果eco命令正确就执行1>>bo.txt,错误就执行2>>bo.txt
[root@yunwei ~]# eco shi1>>bo.txt 2>>bo.txt
[root@yunwei ~]# cat bo.txt
-bash: eco: 未找到命令
#同理2>>bo.txt == 2>&1
[root@nyunwei ~]# echo shi>>bo.txt 2>&1
[root@yunwei ~]# cat bo.txt
shi
[root@yunwei ~]# eco shi>>bo.txt 2>&1
[root@yunwei ~]# cat bo.txt
shi
-bash: eco: 未找到命令
#最简写法
[root@yunwei ~]# echo shi &>>all.log
- 输入重定向符号(与固定命令搭配)
用于与xargs配合,指定读取文件内容
[root@yunwei ~]# seq 10 > num.txt
[root@yunwei ~]# xargs -n3 <num.txt
1 2 3
4 5 6
7 8 9
10
#xargs-n3 表示分3组
- 追加输出重定向
<<用于与cat命令实现写入多行内容
格式: cat >文件<<结束标记
结束标记
1、结束标记两边不要有多余符号
2、一般都是事先写好,然后粘贴到命令行执行。
[root@yunwei ~]# cat >>bo.txt<<EOF
> 123456
> EOF
[root@yunwei ~]# cat bo.txt
shi
-bash: eco: 未找到命令
123456
3、通配符
诞生:用于给linux中大部分命令使用,用于批量找文件名(找文件)
符号 | 含义 |
---|---|
*星号 | 所有 ,*.txt *.log ’ ip ’ |
{}花括号 | 输出序列,与echo,touch,mkdir. |
[] | 参考正则中含义即可 |
[!] [^] | 取反 |
? | 任意一个字符 |
#找出/bin目录下面命令,命令仅有2个字符组成.
ls -l /bin/??
二、正则表达式
正则符号都是英文符号,避免使用中文符号
推荐使用grep/egrep命令,默认设置了别名,自动加上颜色
分析正则与正则匹配到的内容——》测试网站
1、符号概述
正则:regular expression RE
正则表达式 regular expression=regexp | 符号 |
---|---|
基础正则BRE | ^ $ . * [] [^] |
扩展正则ERE |
2、基础正则
环境准备
cat >re.txt <<EOF
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese
chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF
2.1、^ 以什么开头的行
[root@yunwei ~]# grep '^m' re.txt
my blog is http://oldboy.blog.5lcto.com
my qq is 490000448
mygod,i am not oldbey,but OLDBOY!
2.2、$ 以什么结尾的行
[root@yunwei ~]# grep '8$' re.txt
my qq is 490000448
not 49000000448
显示出文件中特殊的隐藏符号
$
是linux中的换行符号,例如第一行在换行前还有一个空格。
[root@yunwei ~]# cat -A re.txt
I am oldboy teacher! $
I teach linux.$
$
那么
^m$
代表什么呢?一行只有m
那么
^$
代表什么呢?空行
[root@yunwei ~]# grep -n '^$' re.txt 3: 7: 10: 12:
案例一:排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行
grep -v '^$' /etc/ssh/sshd_config | grep -nv '^#'
2.3、. 任意一个字符,不匹配空行
grep -o
选项,显示正则匹配到了什么? 显示执行过程.
[root@yunwei ~]# grep 'ba.l' re.txt
I like badminton ball ,billiard ball and chinese chess!
2.4、\ 撬棍 转义字符、去掉特殊符号的含义.
案例二:找出文件中以 . 结尾的行
grep '.$' re.txt
2.5、* 前一个字符连续出现 0 次或 0 次以上
2.6、 .* 所有,任意字符
.
任意一个字符
*
前一个字符连续出现0次或0次以上
.*
表示所有.
案例三:以任意内容开头直到匹配到am字符的行
[root@yunwei ~]# grep '^.*am' re.txt
正则表示连续出现的时候或者表示所有的时候,正则体现出贪婪性,尽可能多的匹配.
匹配开头一直到最后一个o的内容。
2.7、 []表示匹配任意1个字符
grep '[abc]' re.txt
匹配数字
grep '[0-9]' re.txt
匹配小写字母
grep '[a-z]' re.txt
匹配大写字母
grep '[A-Z]' re.txt
字母匹配大小
grep '[a-zA-Z]' re.txt
grep '[a-Z]' re.txt
匹配出以字母m或n开头的行
grep '^[mn]' re.txt
匹配出以.或空格或!结尾的行
grep '[.!]$' re.txt
温馨提示: []中会自动去掉符号的特殊含义
2.8、 [^abc]
表示匹配任意1个字符,排除abc,中括号相当于一个字符
grep '[^abc]' re.txt
2.9、正则小结
正则基础 | 含义 |
---|---|
^ | 以什么开头 |
$ | 以什么结尾 |
^$ | 空行 |
. | 一个字符 |
\ | 转移符号 |
* | 一个字符出现1次或n次 |
.* | 所有 |
[] | [abc] a或b或c,[]表示一个字符 |
[^] | [^abc] 匹配排除abc的内容,[]表示一个字符 |
3、扩展正则
grep===egrep或 grep -E
sed 使用sed -r 支持扩展正则
awk默认支持扩展正则
#Linux三剑客如何支持扩展正则
#grep命令,推荐使用前2个.
egrep '0+' re.txt
grep -E '0+' re.txt
grep '0+' re.txt
#sed 需要使用-r选项
#awk 直接支持扩展正则
3.1、+ 前一个字符连续出现1次或1次以上
取出连续出现的0
egrep '0+' re.txt
取出连续出现的数字
egrep '[0-9]+' re.txt
取出连续出现的字母(单词)
egrep -o'[a-Z]+' re.txt
3.2、 | 或者
文件中包含old或linux的行
egrep 'old|linux' re.txt
排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行
egrep -nv '^$|^#' /etc/ssh/sshd_config
3.3、()表示一个整体,用于后向引用(反向引用sed)
检查系统中tree,vim,sl软件是否安装
rpm -qa | egrep '^(tree|vim|sl)'
3.4、{} a{n,m}前一个字符连续出现至少n次,最多m次
格式 | 应用 |
---|---|
a{n.m} 前一个字符连续出现至少n次,最多m次 | 表示连续出现的范围 |
a{n} 前一个字符连续出现n次 | 匹配固定的次数 |
a{n,} 前一个字符连续出现至少n次 | |
a{,m} 前一个字符连续出现,最多m次 |
匹配IP的正则
[root@yunwei ~]# echo 10.0.0.{1..254} | xargs -n1 > ip.txt
[root@yunwei ~]# egrep '[0-9]{1,3}$' ip.txt
匹配身份证号的正则
地区: ([1-6][1-9]|50)\d{4} // 补充重庆地区50
年的前两位: (18|19|20) 1800-2399
年的后两位: \d{2}
月份:((0[1-9])|10|11|12)
天数: (([0-2][1-9])|10|20|30|31) 闰年不能禁止29+
三位顺序码: \d{3}
校验码: [0-9Xx]
// 校验18位的身份证
let _IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
3.5、? 前一个字符 出现0次或1次
一般用于匹配的内容可能有(出现1次)或者没有出现(出现0次)
3.6、扩展正则小结
扩展正则 | 含义 |
---|---|
+ | 前一个字符连续出现1次或多次 |
| | 或者 |
() | 1、表示整体 2、后向引用或反向引用 |
{} | a{n,m}前一个字符连续出现至少n次,最多m次 |
? | 前一个字符出现0次或1次 |