1.正则表达
1.1正则表达符号
符号 | 描述 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配集合内任一字符 |
[^] | 取反集合内字符 |
. | 匹配单个字符 |
* | 匹配前一个字符x次,可0次(x>=0) |
{n,m} | 匹配前一个字符n到m次 |
{n,} | 匹配前一个字符n次以上 |
{n} | 匹配前一个字符n次 |
() | 组合整体,把多个字符看成“单个字符”处理 |
+ | 最少匹配一次 |
? | 最多匹配一次 |
| | 或者 |
\b | 单词边界(非数字、字母、下划线) |
\d | 任意数字字符 |
\w | 匹配数字字母下划线 |
/s | 匹配空格、tab键 |
备注: 注意转义“\”
1.2使用grep正则匹配
注:grep 加入选项‘-E’或者egrep 可以免去‘\’
grep "a\{1,3\}bc" 1.txt
OR
egrep "a{1,3}bc" abc
egrep "^(abc)" abc
egrep "[0-9a-Z]$" abc
2.sed用法(编辑)
sed命令的常用选项如下:
-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(支持扩展正则)
-i(修改源文件)
- 条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令
- 指令可以是p输出、d删除、s替换
- ‘/’符号可以用其他符号替换,较少转义符号带来的麻烦
2.1 p输出
sed -n 'p' abc #输出所有行
sed -n '1!p' abc #输出除了第一行的所有行
sed -n '$p' abc #输出最后一行
sed -n '3p' abc #输出第三行
sed -n '2,5' abc #输出2行到五行
sed -n '2p;5p' abc #输出第二行和第五行
sed -n '3,+2p' abc #输出第三行以及后面的二行
sed -n '1~2p' abc # 输出第1,3,5等等行,既奇行,隔行2
sed -n '=' abc #输出行号
sed -nr '/^root | ^bin/p' abc #找到root或者bin开头的所有行
2.2 d删除
- [root@svr5 ~]# sed '3,5d' a.txt #删除第3~5行
- [root@svr5 ~]# sed '/xml/d' a.txt #删除所有包含xml的行
- [root@svr5 ~]# sed '/xml/!d' a.txt #删除不包含xml的行,!符号表示取反
- [root@svr5 ~]# sed '/^install/d' a.txt #删除以install开头的行
- [root@svr5 ~]# sed '$d' a.txt #删除文件的最后一行
- [root@svr5 ~]# sed '/^$/d' a.txt #删除所有空行
2.3 s替换
- sed 's/2017/6666/' shu.txt #把所有行的第1个2017替换成6666
- sed 's/2017/6666/2' shu.txt #把所有行的第2个2017替换成6666
- sed '1s/2017/6666/' shu.txt #把第1行的第1个2017替换成6666
- sed '3s/2017/6666/3' shu.txt #把第3行的第3个2017替换成6666
- sed 's/2017/6666/g' shu.txt #所有行的所有个2017都替换
- sed '/2024/s/2017/6666/g' shu.txt #找含有2024的行,将里面的所有2017替换成6666
- sed -r 's/([0-9]+)(\s+)([a-z]+)/\3\2\1/' abc.txt # 将字母和数字换位置,\n表示替换前的字符位置,以()为分界
2.4 a/i追加
- sed 'a 666' user #所有行的下面追加666
- sed '1a 666' user #第1行的下面追加666
- sed '/^bin/a 666' user #在以bin开头的行的下面追加666
- sed 'i 666' user #所有行的上面添加666
- sed '5i 666' user #第5行的上面添加666
- sed '$i 666' user #最后1行的上面添加666
2.5 c替换行
- sed 'c 666' user #所有行都替换成666
- sed '1c 666' user #替换第1行为666
3.awk用法 (提取)
3.1 基本用法
格式1:awk [选项] '[条件]{指令}' 文件
格式2:前置指令 | awk [选项] '[条件]{指令}'
其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
Awk过滤数据时支持仅打印某一列,如第2列、第5列等。
处理文本时,默认将空格、制表符作为分隔符。
条件可以用/ /的方式,与sed类似
awk常用内置变量:
$0 文本当前行的全部内容
$1 文本的第1列
$2 文件的第2列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
- awk '{print}' abc.txt #输出所有
- awk '/to/{print}' abc.txt #输出有to的那行
- awk '{print $2}' abc.txt #输出所有行的第2列
- awk '/to/{print $1}' abc.txt #输出有to的那行的第1列
- awk '{print $0}' abc.txt #输出所有行所有列
- awk '{print $0,$1}' abc.txt #输出所有行所有列,第1列
- awk '{print NR}' abc.txt #输出所有行的行号
- awk '{print NR,$0}' abc.txt #输出所有行的行号,所有列
- awk '{print NR,NF}' abc.txt #输出所有行的行号,列号(有几列)
选项 -F 可以制定分隔符
- awk -F: '{print $1}' user #文档中如果没有空格,可以用F修改分隔符
- awk -F: '{print $1,$6}' user #使用冒号‘:’作为列的分隔符,显示第1、6列
awk还识别多种单个的字符,比如以“:”或“/”分隔
- awk -F [:/] '/^root/{print $1,$10}' user
awk的print指令不仅可以打印变量,还可以打印常量
- awk -F: '{print $1" 的家目录是 "$6}' user #输出常量,加双引号即可