linux基础随心记三-四剑客
一、正则表达式
1、特殊符号
| 引号 | |
|---|---|
| 单引号 | 内容原封不动的输出 |
| 双引号 | 会解析一些特殊符号,但对于{}(通配符)没有解析 |
| 不加引号 | 和双引号类似,额外支持通配符 *.log {1…10} |
| 反引号 | 优先执行反引号内的命令 |
| 重定向 | |
|---|---|
| > | 标准正确输出,先清空后写入 |
| >> | 追加 |
| 2> | 标准错误输出 |
| 2>&1 &>xxx.log | echo xkm >>xkm.log 2>&1 echo xkm &>>xkm.log |
| < | 标准输入 |
| << | cat xxx.txt <<EOF xxxx EOF |
| 通配符 | 用于批量处理文件 |
|---|---|
| * | 所有 |
| {} | 输出序列 |
| [] | |
| ? | 任意一个字符 |
2、正则表达式
配合三剑客使用正则对字符进行过滤
正则表达式在线测试
| 基础正则 | |
|---|---|
| ^xxx | 以xxx开头 |
| xxx$ | 以xxx结尾 cat -A 显示文件中隐藏的特殊符号 |
| ^$ | 空行 |
| . | 任意一个字符 |
| \ | 转义字符 ‘\.$’ 以.结尾 |
| x* | 前一个字符连续出现0次或0次以上 |
| .* | 所有 |
| [] | 匹配任意一个字符 [abc] a或者b或者c 不需要转义,与+搭配较多 |
| [^] | 取反 [^abc] 匹配任意一个字母,除了abc |
| 扩展正则 | egrep 或 grep -E sed -r awk默认支持 |
|---|---|
| + | 前一个字符连续出现1次或1次以上 [0-9]+ 取出所有的数字 [a-Z]+ 取出所有的单词 |
| | | 或者 |
| () | 表示一个整体 或在sed中实现后向引用(反向引用sed) |
| {} | a{n,m} 前一个字符连续出现至少n次,最多m次 a{n} 前一个字符连续出现n次 a{n,} 前一个字符连续出现至少n次 a{,m}前一个字符连续出现最多m次 |
| ? | 前一个字符出现0次或1次 |
| perl正则 | grep -P |
|---|---|
| \d | [0-9] |
| \s | 匹配的空字符 空格 tab \ \t \r \n \f |
| \w | [0-9a-zA-Z_] |
| \D | [^0-9] |
| \s | 非空字符 |
| \W | [^0-9a-zA-Z_] |
二、gerp
- 擅长过滤,过滤速度最快,会把匹配到的行显示出来
| 选项 | 说明 |
|---|---|
| -n | 显示行号 |
| -i | 不区分大小写 |
| -v | 排除 |
# 显示/etc/下面一层中以.conf结尾的文件ls/etc/|grep'\.conf$'find/etc/-maxdepth1-typef-name'*.conf'# 使用grep取出/etc/passwd第一列的数据egrep-o'^[^:]+'/etc/passwd三、sed
- 擅长取行,过滤,增删查
改(替换修改文件内容) - 后向引用(截取)
| -n | 取消默认输出,有p输出时要加上-n,不然会全部输出 |
| -r | 支持扩展正则 |
| -i | 修改文件内容,这个选项要放在最后 |
| -i.bak | 先进行备份,然后修改文件内容,这个选项要放在最后 |
1、查找
- 精确查找 类似于grep的过滤,但是可以指定行号
- 模糊查找
# 取出文件的第三行sed-n'3p'/etc/passwd# 取出文件的第2到5行sed-n'2,5p'/etc/passwd# 取出文件的第2行和第5行sed-n'2p;5p'/etc/passwd# 取出文件的最后一行sed-n'$p'/etc/passwd# 过滤出包含root的行sed-n'/root/p'/etc/passwd# 获取范围内的日志sed-n'/11:00:00/,/24:00:00/p'/var/text.log2、替换
格式: sed ‘s#找谁#替换成什么#g’ 文件名 输出文件内容
sed -i ‘s#找谁#替换成什么#g’ 文件名 修改文件内容
s:substitute 替换
g:global 全局替换,把一行中所有匹配到的内容都进行替换,否则只替换每一行第1个匹配到的内容
3、替换进阶-后向引用
适用于sed命令处理/提取一行中的某一部分,配合正则灵活取列
# \+数字 调用前面的组echo1234567|sed-r's#(1)(.*)(7)#\1<\2>\3#g'1<23456>7# 调换/etc/passwd第一列和最后一列的内容sed-r's#(^.*)(:x.*:)(.*$)#\3\2\1#g'/etc/passwdsed-r's#([a-zA-Z0-9_-]+)(.*:)(.*$)#\3\2\1#g'/etc/passwd# 提取网卡ipipa s eth0|sed-nr'3 s#(^[a-z]+ )(.*)(/.*)#\2#g p'4、删除
d 删除以行为单位
sed ‘3d’ xkm.log
删除空行或带#的行
sed -r ‘/^$|#/d’ xkm.log
5、增加
- cai
a:append 在指定行后面追加内容
i:insert 在指定行上面插入一行
c:replace 替换指定行的内容,取代
sed ‘3a xxx’ xkm.log
四、awk
是一个单行脚本
取行、取列、混合取行与列、统计功能、判断与循环、数组
擅长取列
‘条件{动作}’
1、取行
# 取出第一行awk'NR==1{print $0}'/etc/passwdawk'NR==1'/etc/passwd# NR Number of Record 记录号,行号# 取出第2到5行awk'NR>=2 && NR<=5'/etc/passwd# 过滤出包含root或nobody的行awk'/root|nobody/'/etc/passwd# 过滤出包含从root到nobody的行awk'/root/,/nobody/'/etc/passwd2、取列
$数字 表示取列,$1第一列,$0表示这一行
$NF 最后一列 Number of Field
$(NF-1) 倒数第二列
column -t 对齐
-F 指定分隔符 -F:
$4 ~ /^[01]/ 第4列包含0或1开头( ~ 对某列进行过滤)
# 取出ls -lh的size列和最后一列ls-lh|awk'{print $5,$NF}'# 指定复杂分隔符取ipipa s eth0|awk-F'[ /]+''NR==3{print $3}'# 判断第三列大于1000,取出第一列,第三列和最后一列awk-F:'$3>1000{print $1,$3,$NF}'/etc/passwd# 过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第一列,第三列awk-F:'$4 ~ /^[01]/ {print $1,$3}'/etc/passwd3、统计与计算
- 类似wc -l
awk'{i++} END{print i}'/etc/passwd- 进行累加求和
awk'{i=i+$1} END{print i}'/etc/passwd五、find
擅长在指定目录中查找文件
| 选项 | 说明 |
|---|---|
| -type | 什么类型的文件 f表示文件 d表示目录 |
| -name | 要查找的文件的名称 |
| -size | 根据大小查找文件 +表示大于 -表示小于 |
| -mtime | 根据修改时间查找文件,+ 或 - 表示在指定天数内或后 |
| -user | 根据所属用户 |
| -maxdepth | 指定深度,写在最前面 |
# 对查找到的每个文件执行指定的命令find/var/log/app-name'*.log'-matime+7-execrm-f{}\;# 将查找到的所有文件作为参数传递给指定的命令,而不是逐个执行find/var/log/app-name'*.log'-matime-7-exectarzcf /var/log/app.tar.gz{}+