linux三剑客
linux 三剑客
小技巧
1 | # 命令行展开 |
正则表达式
- 正则工作时以行为单位
- linux 仅受三剑客(sed, awk, grep)支持,其他命令无法使用。(通配符是大部分普通命令都支持的)
基本正则表达式
功能
- 匹配字符
- 匹配次数
- 位置锚定
符号
- ^: 尖角号,用于模式的最左侧,如 “^oldboy”,匹配以 oldboy 单词开头的行。
- $: 美元符,用于模式的最右侧,如 “oldboy$”,匹配以 oldboy 单词结尾的行。
- ^$: 组合符,表示空行。
- .: 匹配任意一个且只有一个字符,不能匹配空行。
- : 转义字符,让特殊含义的字符现出原形,还原本意,例如 . 代表小数点。
- *: 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容。
- .*: 组合符,匹配所有内容。
- ^.*: 组合符,匹配任意多个字符开头的内容。
- .*$: 组合符,匹配任意多个字符结尾的内容。
- [^abc]: 匹配除了 ^ 后面的任意字符,^ 表示对abc取反
扩展正则表达式
- 扩展正则必须用 grep -E 才能生效。
- +: 匹配前一个字符1次或多次。
- [符号集]+: 匹配括号内的字符1次或多次。
- ?: 匹配前一个字符0次或多次。
- |: 表示或者,同时过滤多个字符串。
- (): 分组过滤,被括起来的内容表示一个整体。
- a{n,m}: 匹配前一个字符最少n次,最多m次。
- a{n,}: 匹配前一个字符最少n次。
- a{n}: 匹配前一个字符正好n次。
- a{,m}: 匹配前一个字符最多m次。
grep(Global search Regular expression and Print out the line)
- 文本搜索工具,根据用户指定的模式(过滤条件),对目标文本进行匹配检查,打印匹配的行。
语法
1 | grep [option] [pattern] file |
小技巧
1 | # 过滤空行 |
sed(stream editor)
- 对文件或数据流进行加工处理, 是操作、过滤和转换文本内容的强大工具
- 常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)
语法
- sed [选项] [sed 内置命令字符] [输入文件]
- 选项:
1
2
3
4-n: 取消默认 sed 的输出,常与 sed 内置命令 p 一起用
-i: 直接将修改结果写入文件,不用 -i,sed 修改的是内存数据
-e: 多次编辑,不需要管道符了
-r: 支持正则表达式 - 内置命令字符,用于对文件进行不同的操作功能,如对文件增删改查
1
2
3
4
5a: append,对文件追加,在指定行后面添加一行/多行文本
d: delete,删除匹配行
i: insert,表示插入文本,在指定行前添加一行/多行文本
p: print,打印匹配行的内容,通常 p 与 -n 一起用
s/正则/替换内容/g: 匹配正则内容,然后替换内容(支持正则),结尾 g 代表全局匹配 - sed 匹配范围
1
2
3
4
5空地址: 全文处理
单地址: 指定文件某一行
/pattern/: 被模式匹配到的每一行
范围区间: 10,20 十到二十行; 10,+5 第十行以及向下五行;
步长: 1~2 表示 1,3,5,7,9,奇数行, 2~2 两个步长,表示 2,4,6,8,10,偶数行
awk(格式化之后再输出文本)
- 有强大的文本格式化的能力
语法
- awk [option] ‘pattern[action]’ file …
- awk 也是按行处理的,根据用户指定的分隔符工作
- awk 默认以空格为分隔符,且多个空格也识别为一个空格
1
2
3
4
5
6awk '{print} $0' # 打印所有内容
# $0 表示一整行
# $1 表示第一列信息
# $2 表示第二列信息
# $NF 表示当前分割后的最后一列
# $(NF-1) 表示倒数第二列
内置变量
- $n: 指定分隔符后,当前记录的第 n 个字段
- $0: 完整的输入记录
- FS: 输入字段分隔符,默认是空格
- OFS: 输出字段分隔符,默认是空格
- NF(Number of fields): 分隔后,当前行一共有多少个字段
- NR(Number of records): 当前记录数,行数
自定义输出内容
- awk 必须外层单引号,内层双引号
- 内置变量都不得添加双引号,否则会识别为文本,尽量别加引号
1
awk '{print "第一列",$1,"第二列",$2}' file
参数
- -F: 指定分割字段符
1
2
3awk -F ',' 'print $0' file
awk -v FS=',' 'print $0' file
awk -v FS=',' -v OFS='--------' 'print $1,$2' file - -v: 定义或修改一个 awk 内部的变量
- -f: 从脚本文件中读取 awk 命令
支持 printf 格式化输出
1 | awk '{printf "%s\n", $0}' file |
模式(也叫条件)
- BEGIN 和 END (处理文本之前和之后的动作)
1
2awk 'BEGIN{print "开始:"}{print $0}' file
awk '{print $0}END{print "结束!"}' file - 使用正则
1
awk '/正则表达式/{print $0}' file