引言
grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点。在接下来的内容中,将会详细介绍三种命令的使用。
-
grep:grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。文本过滤器,如果仅仅是过滤文本,可使用grep,其效率比其他的高很多。(过滤文本)
-
sed:可以按行处理数据
-
awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。(处理列)
awk命令使用
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
- awk使用标准格式
awk 选项参数 '{pattern + action}' {filenames}
选项参数 | 含义 |
---|---|
-F fs or –field-separator fs | 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 |
-v var=value or –asign var=value | 赋值一个用户定义变量。 |
-f scripfile or –file scriptfile | 从脚本文件中读取awk命令。 |
-mf nnn and -mr nnn | 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 |
-
示例1
源文件如下
取出文件某一列
-
示例2
格式化输出
- 示例3
使用正则取出含有字母e的第一列以及第二列
-
示例4
awk内部使用if语句
-
示例5
awk中使用循环
awk具有丰富的内置变量可以使用
参数 | 描述 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数 |
NR | 已读的记录数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
grep使用
grep可以用于搜索文件中特定模式的子串
命令的标准使用格式为
grep [option] "string_to_find" filename
其中option中的常用的命令为
命令 | 含义 |
---|---|
-i | 忽略搜索字符串的大小写 |
-v | 取反,即输出不匹配的那些文本行 |
-n | 输出行号 |
-l | 输出能够匹配模式的文件名,相反的选项为-L |
-q | 静默输出 |
-
示例1
搜索以we开头的行
grep "^we" test0.txt
运行结果为(其中^表示开头)
-
示例2
搜索不以we开头的字符串
grep -v "^we" test0.txt
-
示例3
统计匹配成功的行数
-
示例4
匹配 以we开头的行,并显示行号
-
示例5
统计匹配成功的次数
其中源文件为
sed使用
sed 【options】 ‘【command】’ 【filename】
其中options:
命令 | 含义 |
---|---|
-n | 抑制自动(默认的)输出 读取下一个输入行,-n要读取的行号 |
-e | 执行多个sed命令 |
-f | 运行脚本 |
-i | 编辑文件内容 |
-i.bak | 编辑的同时创造.bak的备份 |
-r | 使用扩展的正则表达式 |
其中command
命令 | 含义 |
---|---|
a | 在匹配后追加 |
i | 在匹配后插入 |
p | 打印 |
d | 删除 |
r/R | 读取文件/一行 |
w | 另存 |
s | 查找 |
c | 替换 |
y | 替换 |
h/H | 复制拷贝/追加模式空间(缓冲区)到存放空间 |
g/G | 粘贴 从存放空间取回/追加到模式空间 |
x | 两个空间内容的交换 |
n/N | 拷贝/追加下一行内容到当前 |
D | 删除\n之前的内容 |
P | 打印\n之前的内容 |
b | 无条件跳转 |
t | 满足匹配后的跳转 |
T | 不满足匹配时跳转 |
-
示例1
我对文件name.txt操作
源文件内容如下所示
对源文件中的23替换为00
root@1032:~/shell/dirfor$ sed -i 's/23/000/g' name.txt
修改之后结果为
-
示例2
在文件的行首添加id
root@1032:~/shell/dirfor$ sed -i 's/^/&id /g' name.txt
其中s表示在全文档中寻找,^表示行首位置,代码运行结果为