linux - 练习题 - 06
一、特殊符号
'' 所见即所得,吃啥吐啥
"" 特殊符号会被解析运行
`` ==== $() 先运行里面的命令 把结果留下
> 重定向符号 先清空文件的内容 然后追加文件的最后
>> 追加重定向 追加文件的最后
2> 错误重定向 只有错误的信息 才会通过这个漏洞进入文件中
2>> 错误追加重定向
~ 当前用户的家目录
root ~ /root
oldboy ~ /home/oldboy
! 查找并运行历史命令
!awk 包含 awk 的命令 最近的一条运行 history |grep awk
# 注释 root 用户的命令提示符
$ 取出变量的内容 awk
$ 取某一列的内容 普通用户的命令提示符
* 所有 任何东西
\ 撬棍 转义字符
&& 前一个命令执行成功然后在执行后一个命令
ifdown eth0 && ifup eth0
|| 前一个命令支持失败了再执行后面的命令
二、通配符
通配符是用来查找文件的。以 .txt结尾的文件 *.txt *.log
-
* 所有 任意
[root@oldboyedu01 oldboy]# find -type f -name "*oldboy*"
./oldboy.txt-hard
./oldboy.txt
./oldboy.txt-hard-s
./oldboy
-
{} 生成序列
[root@oldboyedu01 oldboy]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu01 oldboy]# echo {01..10}
01 02 03 04 05 06 07 08 09 10
[root@oldboyedu01 oldboy]# echo stu{01..10}
stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
[root@oldboyedu01 oldboy]# echo {1,9,20}
1 9 20
[root@oldboyedu01 oldboy]# echo A{,C}
A AC
[root@oldboyedu01 oldboy]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[root@oldboyedu01 oldboy]# cp oldboy.txt{,.bak} # 对文件进行了备份。
三、正则表达式
1. 什么是正则表达式,为何使用它?
通过符号表示文件内容
提高效率,省事。
支持正则表示式的三剑客:awk grep sed
2. 使用正则的时候注意事项
正则表达式式按照行进行处理的
禁止使用中文符号
给grep egrep配置别名
[root@oldboyedu01 oldboy]# grep --color=auto "3306" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
[root@oldboyedu01 oldboy]# alias grep="grep --color=auto"
[root@oldboyedu01 oldboy]# alias egrep="grep --color=auto"
cat >>/etc/profile<<EOF
alias grep="grep --color=auto"
alias egrep="egrep --color=auto"
EOF
source /etc/profile
[root@oldboyedu01 oldboy]# grep "3306" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
id.txt
110000198810098735
110000199007021063
11000019781119429X
。。。
[root@oldboyedu01 oldboy]# egrep "^[0-9X]+$" id.txt
110000198909149301
110000198909149301
3.正则表达式与通配符的区别
通配符 --- *.txt *.log 以 .txt .log结尾的文件 大部分命令都可以使用
正则 --- 在文件中匹配查找内容 包含oldboy的行 linux三剑客
4.正则表达式分类
基础正则
^ $ . * [] [^] basic regular expression BRE (grep sed awk)
扩展正则
| + {} () ? extended regular expression ERE (grep -E/egrep sed -r awk)
基础正则
. # 表示任意一个字符,不包含空行
grep '.' oldboy.txt
grep -o '.' oldboy.txt # 正则执行过程,每次执行了
grep '.$' oldboy.txt
\ 转义符号,有特殊含义的符号去掉它的特殊含义。
\n 表示回车换行
* 前一个字符连续出现了0次或者1次以上 >=0
grep '0' oldboy.txt
grep -o '0*' oldboy.txt # 正则的执行过程
问题一:为何会取出000 而不是 00 0 0
因为正则在表示 连续出现的时候表现出贪婪性 有多少吃多少 有多少匹配多少
问题二:为何使用‘0*’会把整个文件的内容都显示出来
A*表示
连续出现了0次A == 什么也没有 就会把整个文件的内容都显示出来
A连续出现了1次以上A
小结:
什么是连续出现
-o 的作用
.* 所有字符 所有符号
grep "^.*o" oldboy.txt
grep "^m.*m$" oldboy.txt
[] 中括号[abc] 相当于是一个字符 找出包含a或b或c
grep [abc] oldboy.txt
grep -on [abc] oldboy.txt # a b c
grep '[a-f]' oldboy.txt # a到f
grep '[a-zA-Z0-9]' oldboy.txt
[^]
grep '[^abc]' oldboy.txt # 表示排除 排除a 或b 或c
练习:以m或n或o开头的 并且以m或g结尾的行
grep '^[mno].*[mg]$' oldboy.txt
小结:
^ $ ^$ . * .* [] [^]
扩展正则
+ 前一个符号连续出现了1次或多次
grep -E '0+' oldboy.txt
egrep '0' oldboy.txt -o
egrep '0+' oldboy.txt -o
egrep [a-z] oldboy.txt
连续出现的小写字母
egrep '[a-z]+' oldboy.txt -o
小结:
+ 可以把连续的东西通过正则取出来
一般与[]配合
| 表示或者
egrep 'oldboy|linux' oldboy.txt
egrep '[ab]' oldboy.txt
egrep 'a|b' oldboy.txt
[]与|区别:
[]表示的是 单个字符或者[a-z]
|表示单个字符或者多个字符
() 括号中的内容相当于是一个整体 后向应用(反向引用)
egrep 'oldb(o|e)y' oldboy.txt
后向引用,反向引用
sed 把你想要的内容先保护起来(通过小括号)然后再使用
[root@oldboyedu01 oldboy]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>
[root@oldboyedu01 oldboy]# echo 123456|sed -r 's#.(.)..(.)(.)#\3#g'
6
{} o{n,m} 前一个字符连续出现了至少n次,最多m次。
o{n} 前一个字符连续出现了n次。
o{n,} 前一个字符连续出现了至少n次,
o{,m} 前一个字符最多出现了m次。
egrep '0{3,4}' oldboy.txt
egrep -o '0{3,4}' oldboy.txt
egrep '0{3,}' oldboy.txt # 连续出现3次以上
egrep '0{3}' oldboy.txt # 连续出现3次
egrep '[0-9]{5,}' oldboy.txt # 数字连续出现5次以上的
? 表示前一个字符连续出现0次或者1次
[root@oldboyedu01 oldboy]# egrep 'go?d' li.log
gd
god
[root@oldboyedu01 oldboy]# egrep 'go*d' li.log
gd
good
god
gooood
四、正则表达式总结
连续出现(重复)
* >=0
+ >=1
? 0 1
{n,m} >=n <=m
{n} ==n
其他
. 任意一个字符
[abc] 一个整体 相当于是一个字符 [a-z] [0-9] [A-Z] [^abc] 排除
| 或者
() 后向引用 反向引用 先保护再使用
^
$
.* 所有
^$ 空行
五、基础正则与扩展正则区别
支持基础正则 基础+扩展
grep egrep === grep -E
sed sed -r
awk awk
帮助文档:
man grep
info grep