简介
linux三剑客是指在linux操作系统中非常重要的三个命令,即awk,grep,sed这三个命令。它们都具有优秀的处理文件的功能。
①awk:多用于取列。
②grep:多用于查找或匹配文本。
③sed:多用于替换和取行。
正则表达式
在使用linux三剑客前,我们还需要了解一下正则表达式,因为linux三剑客可以根据正则表达式来查找和匹配文本。正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,以下仅列出一部分常用的元字符。
元字符 | 描述 |
---|---|
\ | 转义符,将特殊字符进行转义,忽略其特殊意义 |
^ | 匹配行首,^则是匹配字符串的开始 |
$ | 匹配行尾,$则是匹配字符串的结尾 |
* | 匹配前面的子表达式任意次(可以为0次) |
+ | 匹配前面的子表达式一次或多次(大于等于1次) |
? | 匹配前面的子表达式0次或1次 |
{ } | 重复,有多中表达形式。如{n}:重复n次,{n,}:重复n次或更多次,{n,m}:重复n到m次 |
. | 匹配除换行符\n之外的任意单个字符 |
[ ] | 匹配包含在[字符]之中的任意一个字符 |
[^] | 匹配[ ^字符]之外的任意一个字符 |
[-] | 匹配[ ]中指定范围内的任意一个字符,要写成递增,如[0-9] |
grep命令
grep能全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。因此grep更适合单纯的查找或匹配文本。其用法如下:
grep [选项]... Pattern [file]...
grep选项有很多,以下仅列出一部分,想要了解更多选项可以通过grep --help命令进行查询了解。
grep --help
选项(模式选择) | 描述 |
---|---|
-E | 模式是扩展正则表达式 |
-F | 模式是字符串 |
-G | 模式是基本正则表达式 |
-P | 模式是Perl正则表达式 |
-e | 用指定的模式字符串来进行匹配操作 |
-f | 从给定文件中取得模式 |
-i | 在模式和数据中忽略大小写 |
-n | 显示匹配的行数 |
-w | 强制模式仅完全匹配字词 |
-x | 强制模式仅完全匹配整行 |
-z | 数据行以一个 0 字节结束,而非换行符 |
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ vim test.txt
Correct:
13322110001
15866666668
Wrong:
11112345678
123
####查找以w开头的所有行(忽略大小写),并显示行号
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ grep '^w' test.txt -i -n
4:Wrong:
####查找正确的手机号
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ grep -E '^1[3-9][0-9]{9}' test.txt
13322110001
15866666668
awk命令
awk 是一种处理文本文件的语言,是一个强大的文本分析工具。相较于另两个命令,awk 更适合格式化文本,对文本进行较复杂格式处理。awk语法如下:
awk [选项] [Program] [file]
awk选项:
选项 | 描述 |
---|---|
-f | 从脚本文件中读取awk命令 |
-F | 指定分隔字段符 |
-v | 赋值一个用户定义变量 |
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ vim salary.txt
ID | name | working_days | leaving_days | salary_perday | wages_intotal
1 | zhangsan | 29 | 2 | 100 | 2900
2 | lisi | 31 | 0 | 100 | 3100
3 | wangwu | 25 | 6 | 200 | 5000
4 | zhaoliu | 28 | 3 | 150 | 4200
5 | guaner | 30 | 1 | 100 | 3000
####使用-F指定|为分隔符
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ awk -F "|" '{print $2,$3,$4,$5,$6}' salary.txt
name working_days leaving_days salary_perday wages_intotal
zhangsan 29 2 100 2900
lisi 31 0 100 3100
wangwu 25 6 200 5000
zhaoliu 28 3 150 4200
guaner 30 1 100 3000
awk变量:
变量名 | 描述 |
---|---|
$n | n>0时,当前的第n个列所在的字段;n=0时,完整的一行记录 |
FS(Field Separator) | 输入字段分隔符, 默认为空白字符 |
OFS(Out of Field Separator) | 输出字段分隔符, 默认为空白字符 |
RS(Record Separator) | 输入记录分隔符(输入换行符), 指定输入时的换行符 |
ORS(Output Record Separate) | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF(Number for Field) | 当前行的字段的个数(即当前行被分割成了几列) |
NR(Number of Record) | 行号,当前处理的文本行的行号 |
FNR | 各文件分别计数的行号 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数 |
####输出zhangsan所在行
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ awk '/zhangsan/{print $0}' salary.txt
1 | zhangsan | 29 | 2 | 100 | 2900
####输出第二行和第三行
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ awk 'NR>1&&NR<=3{print $0}' salary.txt
1 | zhangsan | 29 | 2 | 100 | 2900
2 | lisi | 31 | 0 | 100 | 3100
####指定输入字段分隔符为'|',输出字段分隔符为'~',并输出第二列和最后两列
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ awk -v FS='|' -v OFS='~' '{print $2,$(NF-1),$(NF)}' salary.txt
name ~ salary_perday ~ wages_intotal
zhangsan ~ 100 ~ 2900
lisi ~ 100 ~ 3100
wangwu ~ 200 ~ 5000
zhaoliu ~ 150 ~ 4200
guaner ~ 100 ~ 3000
sed命令
sed是一种流编辑器,它一次仅处理一行。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。因此sed更适合编辑匹配到的文本。sed命令语法如下:
sed [选项] [script] [file]
sed选项
选项 | 描述 |
---|---|
-e | 以选项中指定的script来处理输入的文本文件 |
-f | 以选项中指定的script文件来处理输入的文本文件 |
-i | 直接修改文件(如果指定扩展名则备份文件) |
-n | 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行 |
sed处理动作
动作 | 描述 |
---|---|
a | 向匹配行后面插入内容,会在匹配行的下一行输出 |
c | 更改匹配行的内容 |
d | 删除匹配的内容 |
i | 向匹配行前插入内容,会在匹配行的上一行输出 |
p | 打印出匹配的内容,通常与-n选项和用 |
s | 替换掉匹配的内容,通常可以搭配正则表达式 |
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ vim test_sed
This Is a Test For SED!
What is sed?
sed is a great GUN.
####a和i动作的区别
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ sed -e '1a\it is a new line!' test_sed
This Is a Test For SED!
it is a new line!
What is sed?
sed is a great GUN.
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ sed -e '1i\it is a new line!' test_sed
it is a new line!
This Is a Test For SED!
What is sed?
sed is a great GUN.
####修改第一行
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ sed '1c\changed!!!' test_sed
changed!!!
What is sed?
sed is a great GUN.
####删除第二行
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ sed '2d' test_sed
This Is a Test For SED!
sed is a great GUN.
####将sed替换为command_sed
lgs@lgs-virtual-machine:~/Desktop/study/test/new_test$ sed 's\sed\command_sed\' test_sed
This Is a Test For SED!
What is command_sed?
command_sed is a great GUN.