Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。
我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。
在说这三个命令前我们要插入一个小插曲就是“正则表达式”。
一、正则表达式
所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。
三剑客与正则表达式是什么关系呢?
我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!
现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。具体如下
元字符 功能 意思
^ 匹配行首 表示以某个字符开头
$ 匹配行尾 表示以某个字符结尾
^$ 空行的意思 表示空行的意思
. 匹配任意单个字符 表示任意一个字符
* 字符* 匹配0或多个此字符 表示重复的任意多个字
\ 屏蔽一个元字符的特殊含义 表示去掉有意义的元字符的含义
[] 匹配中括号内的字符 表示过滤括号内的字符
.* 代表任意多个字符 就是代表任意多个字符
lele\{n\} 用来匹配前面lele出现次数。n为次数 就是统计前面lele出现的次数
lele\{n,\} 含义同上,但次数最少为n
lele\{n,m\} lele出现次数在n与m之间
三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。
二、grep
1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
--color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
测试:
grep 匹配条件 处理文件
grep root passwd ##贪婪匹配
grep ^root passwd ##以root开头
grep bash$ passwd ##以bash结尾
grep -i root passwd ##忽略大小写
grep -E "root|ROOT" passwd ##后面条件可以是一个正则表达式
cat -b passwd | grep mail ##默认显示mail所在行
cat -b passwd | grep mail -2 ##查看mail及上下两行
cat -b passwd | grep mail -A2 ##查看mail及下两行
cat -b passwd | grep mail -B2 ##查看mail及上两行
-
'ws'
-
'w...s'
-
'w.....'
-
'.....s'
三、sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
1.sed命令格式
sed [option]... 'script' inputfile
(1)选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 直接编辑文件
-i.bak 备份文件并原处编辑
(2)script 地址定界
不给地址:对全文进行处理
单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
地址范围:
#,#
#,+#
/pat1/,/pat2/
`#,/pat1/
~:步进
1~2 奇数行
2~2 偶数行
(3)编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a [\]text1 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中
(1)p模式操作
-
cat fstab -n | sed
5p ##编辑第五行,并在屏幕中显示
-
cat fstab -n | sed -n
4p ##只显示第五行
-
cat fstab -n | sed -n
3,6p ##显示
3-
5行内容
-
cat fstab -n | sed -n
'3p;6p' ##显示第三行和第五行
-
sed -n
'/#/p' fstab
##显示#所在行
-
sed -n
'/#/!p' fstab
##显示不带#的行
-
sed -n
'/\:/p' fstab
##显示含:的行
-
sed -n
'^UUID/p' fstab
##显示以UUID开头的行
-
sed -n
'/^$/!p' fstab
##不显示空白行
-
sed -n
'/^$/!p' fstab | sed -n
'/^#/!p'
##不显示空白行和#所在行
(2)d模式操作
-
sed
'/^UUID/d' fstab
##删除UUID所在行
-
sed
'/^UUID/!d' fstab
##出UUID行,其他都删除
-
sed
'/^#/d' fstab
##删除所有含#的行
-
sed
'/^$/d' fstab
##删除空格行
-
cat -n fstab | sed
'5d'
##删除第五行
-
cat -n fstab | sed
'2d;5d'
##删除第二行和第五行
-
cat -n fstab | sed
'2,5d'
##删除2-5行
(3)a模式操作
-
sed
'/^UUID/ahello' fstab
##在UUID下一行添加
-
sed
'/^UUID/ahello\nvan' fstab
##在UUID下一行添加两行
-
sed
'4ahello\nvan' fstab
##在第四行的下一行添加
-
sed
'4ihello\nvan' fstab
##在第四行插入
(4)c模式操作
-
sed
'/#/chello' fstab
##将所有含#的行改为hello
-
sed
'/^#/cwestos' -i fstab
##将所有含#的行给为westo并保存修改
练习:编写一个脚本,用来改写apache配置文件中的端口号
(5)w模式操作
sed '/^UUID/w file' fstab ##将UUID所在行,导入file文件,该文件可以不存在
(6).sed的其他用法
6.1统计文件行数
sed -n '/^UUID/=' fstab ##统计文件的行数
sed '/^UUID/=' fstab ##将行数放到UUID所处位置
sed -n '$=' fstab ##统计行数
wc -l fstab | cut -d " " -f 1
6.2插入内容
sed '6r /opt/insert' fstab ##将/mnt/file文件的内容放到fstab文件的第六行后
sed '$r /opt/insert' fstab ##将/mnt/file文件的内容放到fstab文件的最后
sed '$r /opt/insert' fstab -i fstab ##保存对该文件的修改,该文件必须存在,不存在则不能使用该命令
sed '$r/opt/insert' fstab > test ## 保存修改到test文件中
6.3处理规则设定
-
sed -f rule fstab 根据文件中的规则对文件进行处理
-
vim rule
-
/^UUID
/p
-
/UUID
/
=
6.4替换文件内容
sed 's/sbin/#########/g' passwd ##将文件所有sbin替换成########
sed '1,5s/sbin/#########/g' passwd ##将文件前五行中的sbin替换成########
sed '/adm/,/halt/s/sbin/********/g' passwd ##将adm到halt行中的sbin替换成*******
sed 's/\///g' passwd ##将passwd文件中的所有/删除
6.5 @与/等同
sed 's@/@#####@g' passwd ##将passwd文件中的所有/替换成#####,其中@也是/
sed 's@sbin@####@g;s/nologin/*******/g' passwd
sed -e 's@sbin@####@g' -e 's/nologin/!!!!!/g' passwd
6.6其他命令
-
sed
'G' fstab ##在每一行后面添加一个空白行
-
sed
'$!G' fstab
-
sed
'=' fstab ##在每一行前添加行号
-
sed
'=' fstab | sed
'N;s/\n//' ##进行预处理
四 AWK
AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。
命令基本格式:
awk [optioins] {program} file
简化命令 | 选项 | 描述 |
-F | fs | 指定行中划分数据字段的字段分隔符 「* 超高频」 |
-f | file | 从指定的文件中读取程序 |
-v | var=value | 定义awk程序中的一个变量及其默认值 |
-mf | N | 指定要处理的数据文件中的最大字段数 |
-mr | N | 指定数据文件中的最大数据行数 |
-W | keyword | 指定awk的兼容模式或者警告登记 |
$0 :代表整个文本行
$1:代表文本行中的第一个数据字段(第一列)
$2:代表文本行中的第二个数据字段(第二列)
$n:代表文本行中的第二个数据字段(第n列)
转载于
https://blog.csdn.net/vanvan_/article/details/91397655?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167521843016800182744804%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167521843016800182744804&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-14-91397655-null-null.142v72pc_search_v2,201v4add_ask&utm_term=sed%E4%BD%BF%E7%94%A8&spm=1018.2226.3001.4187