介绍
linux操作文本的三大利器,三者都能处理文本,侧重点不同,
grep 适合单纯查找或者匹配文本
sed 适合编辑匹配文本
awk 适合格式化文本,对文本进行较复杂的格式处理。
- grep:数据查找定位
- awk:数据切片
- sed:数据修改
- sed 和 awk 最大的区别:sed是以行向操作,awk是以列向操作
场景
命令 | 特点 | 应用场景 |
grep | 文本过滤 | 包括从文件中进行过滤和从标准输入进行过滤,其过滤速度最快 |
sed | 取行 | 文件内容新增、删除、替换、取出某个范围的内容 |
awk | 取列 | 编写awk脚本对文本进行格式化输出(可进行统计计算) |
grep
Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
常见查进程命令:
ps -ef|grep xxxx
命令格式:grep [option] pattern file
命令参数
常用参数已加粗
- 之后的内容。
- 之前的内容。
- 之前后的内容。
- -c:统计匹配的行数
- -e :实现多个选项间的逻辑or 关系
- -E:扩展的正则表达式
- 从FILE获取PATTERN匹配
- -F :相当于fgrep
- -i --ignore-case #忽略字符大小写的差别。
- -n:显示匹配的行号
- -o:仅显示匹配到的字符串
- -q: 静默模式,不输出任何信息
- -s:不显示错误信息。
- -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
- -w :匹配 整个单词
grep -A/B/C
前三个 A、B、C 参数很容易理解,举个栗子,假设我们有一个文件,文件名是 test,内容是从 1 到 9,每个数字一行:
grep -A2 7 test 789
-A2 7 的效果就是找到 7 ,然后输出 7 后面两行。
grep -c 输入匹配行数
gerp -c 1 test
grep -e
是实现多个匹配之间的或关系,比如我们想找包含aaaa或者bbbb的,显然应该返回第一行和第二行:
grep -e aaaa -e bbbb test
grep -F相当于fgrep命令,就是将pattern视为固定字符串
➜ grep 'aa*' test
aaaa
AAAaaa
➜ grep -F 'aa*' test
可以看到第二次就找不到了,因为搜索的是 aa*这个字符串,而不是正则表达式。
sed
sed全称为Stream EDitor,sed是一个流编辑器,在处理行内容时功能十分强大,可以利用脚本来处理文本文件或者是标准输入(stdin)。使用方法:
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的 script 来处理输入的文本文件,这个-e可以省略,直接写表达式。
-f<script文件>或--file=<script文件>以选项中指定的 script 文件来处理输入的文本文件。
-h或--help显示帮助。
-n 或 --quiet 或 --silent 仅显示 script 处理后的结果。
-V 或 --version 显示版本信息。
动作说明:
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
a 增加内容
先准备一个文件,名为test做测试
➜ cat test
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
sed -e 3a\newLine testfile ;在第三行后面追加newLine 这么一行字符,字符前面需要用反斜线区别,执行完毕之后看到结果:
➜ sed -e 3a\newline test
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
newline
Linux test
但是注意,这个只是将文字处理了,没有写入到文件里,文件里还是之前的内容。
其实 a 前面是可以匹配字符串,比如我们只想在出现 Linux 的行后面追加,就可以:sed -e /Linux/a\newline test 两个斜线之间的内容是需要匹配的内容。可以看出,只有第二、第四行有Linux,所以结果如下:
➜ sed -e /Linux/a\newline test
HELLO LINUX!
Linux is a free unix-type opterating system.
newline
This is a linux testfile!
Linux test
newline
这里用双引号把整个表达式括起来也可以,还方便处理带空格的字符。
sed -e /Linux/a\newline test等效于sed "/Linux/a newline"
i 插入内容
跟 a 类似,sed 3i\newline test是在第三行前面插入newline:
➜ sed 3i\newline test
HELLO LINUX!
Linux is a free unix-type opterating system.
newline
This is a linux testfile!
Linux test
sed /Linux/i\newline test是在所有匹配到Linux的行前面插入:
➜ sed /Linux/i\newline test
HELLO LINUX!
newline
Linux is a free unix-type opterating system.
This is a linux testfile!
newline
Linux test
可以看出插入的用法和增加很相似
d删除
删除的字符是d,用法跟前面也很相似,就不赘述,例子如下:
➜ sed '/Linux/d'test
HELLO LINUX!
This is a linux testfile!
可以看到删除了匹配到的两行。
c替换
替换也是一样,字符是c。举个栗子:
➜ sed '/Linux/c\Windows'test
HELLO LINUX!
Windows
This is a linux testfile!
Windows
替换还有个字符是 s,但是用法由不太一样了,最常见的用法:sed 's/old/new/g'其中old代表想要匹配的字符,new是想要替换的字符,比如:
➜ sed 's/Linux/Windows/g'test
HELLO LINUX!
Windows is a free unix-type opterating system.
This is a linux testfile!
Windows test
这里的/g的意思是一行中的每一次匹配,因为一行中可能匹配到很多次。我们拿一个新的文本文件做例子:
➜ cat test2
aaaaaaaaaaa
bbbbbabbbbb
cccccaacccc
假设我们想把一行中的第三次及以后出现的a变成大写A,那应该这么写:
➜ sed 's/a/A/3g' test2
aaAAAAAAAAA
bbbbbabbbbb
cccccaacccc
可以看出只有第一行的有的改了,因为第二第三行没有这么多a出现。
awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
语法
awk [选项参数]'script'var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
awk -f {awk脚本} {文件名}
参数说明:
-F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value 赋值一个用户定义变量。
-f scripfile or --file scriptfile 从脚本文件中读取awk命令。
基本用法
最基本的用法是awk 动作 文件名。我们先准备一个文件test:
➜ cat test2
this is a test
3 Are you like awk
This's a test10 There are orange,apple,mongo
然后输入awk '{print $1,$4}' test就可以看到:
2 a
3 like
This's
10 orange,apple,mongo
awk -F命令可以指定使用哪个分隔符,默认是空格或者 tab 键:
➜ awk -F, '{print $2}' test
apple
变量
awk中有不少内置的变量,比如$NF代表的是分割后的字段数量,相当于取最后一个。
➜ awk '{print $NF}'testtest
awk
test
orange,apple,mongo
可以看出都是每行的最后一项。
其他的内置变量还有:
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。
函数
awk还提供了一些内置函数,方便对原始数据的处理。主要如下:
toupper():字符转为大写。
tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
条件
awk允许指定输出条件,只输出符合条件的行。输出条件要写在动作的前面:
awk '条件 动作' 文件名
还是刚才的例子,用逗号分隔之后有好几个空白行,我们加上限制条件,匹配后为空的不显示:
➜ awk -F, '$2!="" {print $2}'test
apple
可以看到就只剩下apple了。
if 语句
awk提供了if结构,用于编写复杂的条件。比如:
➜ awk '{if ($2 > "t") print $1}'test2
这一句的完整含义应该是:把每一行按照空格分割之后,如果第二个单词大于t,就输出第一个单词。这里对字符的大小判断应该是基于字符长度和 unicode 编码。