linux三剑客(awk,grep,sed)

简介

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.

你可能感兴趣的:(linux,正则表达式,perl)