Linux文本三剑客
grep sed awk的基本使用
grep
Global search REgular expression and Print out the line
文本搜索工具,根据用户指定的“模式(过滤条件)“对目标文本进行逐行过滤
由正则表达式的元字符
和文本字符
所编写出的过滤条件
基本格式
1 |
|
BRE基本正则和ERE扩展正则
基本正则
1 |
|
扩展正则(需要带上-E
)
字符 | 作用 |
---|---|
+ | 1或n次 |
[1-5]+ | 字符1或n词(同上) |
? | 0或者1 |
| | 或关系 |
() | 分组(含前向引用等用法) |
a{n,m}类 |
1 |
|
sed
Stream Editor(字符流编辑器),流编辑器
结合正则对文本快速增删改查,主要功能为过滤
和取行
基本格式
1 |
|
参数 | 作用 |
---|---|
-n | 取消默认sed输出,常和p一起用 |
-i | 直接将修改结果写入文件。若不用-i,则sed修改的是内存数据 |
-e | 多次编辑,不需要管道符了 |
-r | 支持正则扩展 |
内置字符
sed的内置命令字符
用于对文件进行不同的操作功能,如对文件增删改查
内置字符 | 作用 |
---|---|
a | append,对文本追加,在指定行后面添加一或多行文本 |
d | delete,删除匹配行 |
i | insert,插入文本,在指定行前添加一或多行 |
p | print,打印匹配行的内容,常与-n搭配 |
c | 替换,c后接字符串,可以取代n1,n2之间内容 |
s/正则/替换内容/g | 匹配正则内容,然后替换内容,g代表全局匹配 |
匹配范围
范围 | 解释 |
---|---|
空地址 | 全文处理 |
单地址 | 指定文件的某一行 |
/pattern/ | 被匹配到的每一行 |
范围区间 | 10,20 10到20行 ,10,+5第10行向下5行 ,/pattern1/,/pattern2/ |
步长 | 1~2 ,表示1、3、5、7、9、奇数行,2~2 两个步长,表示2、4、6、8、10、偶数行 |
平常用到:
- 针对某一行替换
1 |
|
- 找到某行再处理其下n行
1 |
|
awk
具有文本格式化能力,同时也是一门简单的编程语言,具有变量、数组、判断、循环等功能
基本格式
1 |
|
1 |
|
打印文本的第一列(默认用空格分隔)
- $0代表一整行
$NF
表示当前分割最后一列,倒数第二列$(NF-1)
选项
参数 | 作用 |
---|---|
F | 指定分隔符 |
v | 定义 or 修改一个awk内部变量 |
f | 从脚本中读取awk命令 |
更多选项详见手册 |
内置变量
内置变量 | 含义 |
---|---|
$n | 当前第n个字段 |
$0 | 整行 |
FS | 字段分隔符,默认空格 |
NF | 当前一共多少个字段 |
NR | 当前记录数,行数 |
一次输出多列
1 |
|
自定义输出内容
awk必须外层单引号,内层双引号
内置变量$1、$2
都不能添加双引号,否则会识别为文本,尽量别加引号
1 |
|
输出整行信息
1 |
|
显示文件第5到7行
1 |
|
显示行号和每行数据
1 |
|
awk分隔符有两种
- 输入分隔符(FS)默认空格
- 输出分隔符(OFS)
内置变量
- 内部变量在输出中不需要
$
,但时其代表一个数字时加上$
,即可表示$number
1 |
|
下面是详细版本的内置变量
内置变量 | 作用 |
---|---|
FS | 输入字段分隔符,默认空格 |
OFS | 输出字段分隔符,默认空格 |
RS | 输入资料分隔符(输入换行符),指定输入时的换行符 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF | number of field,当前行的字段个数 |
NR | 行号 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
ARGC | 命令行参数个数 |
ARGV | 数组,命令行给定的参数 |
分隔符修改
1 |
|
修改输出符
1 |
|
修改RS
- RS输入分隔符,修改后碰见修改字符就输出分割
1 |
|
修改ORS
- ORS输出分隔符,awk默认每一行结束就要添加
回车换行符
,即ORS默认为回车换行
1 |
|
RS ORS一起用
1 |
|
ARGV
1 |
|
自定义
1 |
|
格式化输出
printf格式化
- 用法同c语言中的printf,print自带换行,printf不带
- 用
-
左对齐
模式pattern
空模式
关系运算符模式
关系运算符 作用 示例 <、<=、==、!=、>=、> 比较 x!=y ~ 匹配正则 x~/regex/ !~ 不匹配正则 x!~/regex/ 1
2
3awk -F ":" '/root/ {printf "%-15s\t%-15s\t%-15s\t%-15s\n", $1, $2, $3, $4}' /etc/passwd # 找出含有root的行
awk -F ":" '/root/,/docker/ {printf "%-15s\t%-15s\t%-15s\t%-15s\n", $1, $2, $3, $4}' /etc/passwd # 找出root和docker之间的行
- BEGIN/END模式
- BEGIN模式是处理之前执行的动作
- END模式是处理完所有行之后执行的动作
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!