sed介绍
什么是sed?
Sed是一个流处理编辑器,它能帮助我们自动处理文件、分析日志文件、修改配置文件等。
Stream Editor文本流编辑,sed是一一个“非交互式的"面向字符流的编辑器。能同时处理多个文件多行的内容
- 可以不对原文件改动,把整个文件输出到屏幕
- 可以把匹配到的内容输出到屏幕上
- 还可以对原文件改动,但是不会再屏幕上返回结果
sed处理流程
sed参数说明
- sed [-hnV][-e<script>] [-f<script文件>] [文本文件]
- -e<script>或--expression= <script>以选项中指定的script来处理输入的文本文件。
- -f<script文件> 或--file= <script文件>以选项中指定的script文件来处理输入的文本文件。
- -h或--help显示帮助。
- -n或--quiet或--silent仅显示script处理后的结果。
- -V或--version显示版本信息。
sed动作可以理解为操作
- a:新增,a的后面可以接字串,新增字符串会在目前的下一行
- c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行
- d:删除,因为是删除,所以d通常写在最后
- i:插入,i的后面可以接字串,新增字串会在目前的上一行
- p:打印,将某个选择的数据显示出。通常p会与参数sed -n一起运行
- s:替换,可以直接进行替换。通常这个s的动作可以搭配正则表示。例如1,20s/old/new/g (是不是和vim的替换很像? )
sed修改文件
- 前面的一系列操作,只是在屏幕上按要求输出了内容,而文件本身并没有改变。
- sed也可以用于文件自身的修改。但这样操作非常危险,有可能误操作将文件改坏,所以我们要在有充足把握的情况下才能这样使用。
- 结合-i和查找替换即可修改文件,上例中加-i即可。
sed -i 's\Hello\haha\g' sed.test
示例文件
查找行,在文件中查找包含789的行
cat sed.test | sed -n '/789/p'
在文件中添加第三行,内容为hello world
sed -e '2a hello world' sed.test
删除行,删除2到3行
cat -n sed.test | sed -e '2,3d'
删除包含789的行
cat sed.test | sed '/789/d'
替换行,将1-2行替换为hahaha
cat -n sed.test | sed '1,2c hahaha'
awk的使用
什么是awk?
awk是一种编程语言,用于在linux/unix 下对文本和数据进行处理。它支持用户自定义函数和动态正则表达式等功能,是linux/unix 下的一一个强大编程工具。
awk命名来自于三位创始人Alfred Aho, Peter Weinberger,和Brian Kernighan的Family Name的首字符。
awk的处理方式
awk一次处理一行内容
awk对每行可以切片处理,空格和制表符为默认分隔符将每行切片,切开的部分再进行各种分析处理
awk格式
命令格式:
awk [选项参数] 'script' var=value file(s)
script组成:pattern {awk操作命令}
pattern:正则表达式;逻辑判断式
awk操作命令:内置函数:print() printf() getline..;
控制指令:if(){...}else{...};while(){..};
Awk内嵌参数应用
内置变量1:
$0:表示整个当前行
$1:每行第一个字段
...
内置变量2:NR:每行的记录号,行号
NF:字段数量变量,字段总数
FILENAME:正在处理的文件名
awk示例
以:分割,显示/etc/passwd的第一列,即用户名列
cat /etc/passwd | awk -F : '{print $1}'
显示/etc/passwd的第1列和第4列,用逗号分隔显示,所有行开始前添加列名start1, start4;最后一行添加,end1,end4
cat /etc/passwd | awk -F ':' 'BEGIN {print "start1,start4"} {print $1 "," $4} END {print "end1,end4"}'
匹配某段字符
cat /etc/passwd | awk -F : '$1 ~ /oo/'
显示/etc/passwd的前五行,显示每行的行号、列数,以及该行完整的内容
head -n5 /etc/passwd | awk -F : '{print NR " " NF " " $0}'
条件操作匹配
cat /etc/passwd | awk -F : '$3 == "0"'
这里操作符号可以用==、>、>=、<、<=、!= 都是可行
和数字比较时,将数字要用双引号""引起来,表示字符串,不加引导则表示数字
cat /etc/passwd | awk -F : '$3<="1000"'
累加前四行用户的uid
head -n4 /etc/passwd | awk -F : '{(sum=sum+$3)};END{print sum}'
流程控制类
输出第一个字段的第一个字符大于q的行
cat /etc/passwd | awk -F ':' '{if($1 > "q"){print $1}else{print "_"}}'