文本处理—sed和awk详解

sed
stream editor:一次处理一行内容,处理时,把当前行存储在临时缓冲区,处理完后,输送到屏幕。

sed [参数] '命令' file
	p	###显示
	d	###删除
	a	###添加
	c	###替换
	i	###插入
	-i	###修改文件内容,不从屏幕输出
	-n	###静默 无任何输出
	-e	###在命令行编辑
	-f	###直接写入文件
p	###显示
[root@station mnt]# vim tmp 
[root@station mnt]# cat tmp 
hello
test
#test
####显示以#开头的行
[root@station mnt]# sed -n '/^#/p' tmp 
#test
####显示不以#开头的行
[root@station mnt]# sed -n '/^#/!p' tmp 
hello
test
d	###删除
[root@station mnt]# vim tmp 
####删除以#开头的行
[root@station mnt]# sed '/^#/d' tmp 
hello
test
[root@station mnt]# cat tmp 
hello
test
#test

上面执行结果虽然屏幕显示删除了以#开头的行,但实际上不会改变文件内容

a	###添加
####在test后换行,添加westos
[root@station mnt]# sed '/test/awestos' tmp 
hello
test
westos
#test
westos
c	###替换
####将test替换为tmp输出到屏幕
[root@station mnt]# sed '/test/ctmp' tmp 
hello
tmp
tmp
i	###插入
####在hello前插入westos
[root@station mnt]# sed '/hello/iwestos' tmp 
westos
hello
test
#test
-i	###修改文件内容,不从屏幕输出
[root@station mnt]# sed -i '/hello/iwestos' tmp 
[root@station mnt]# cat tmp
westos
hello
test
#test

例:修改http端口为8080

[root@station mnt]# vim port.sh
[root@station mnt]# cat port.sh 
#!/bin/bash
yum install -y httpd &> /dev/null
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf
echo -e "Port has changed!"
echo "Now ,Port is $1!"
[root@station mnt]# sh port.sh 8080
Port has changed!
Now ,Port is 8080!

在这里插入图片描述

awk 报告生成器
awk处理机制:根据模式一次从文件中抽取一行文本,对这行文本进行切片(默认使用空白字符作为分隔符)

awk '{print $0}' tmp	###$0表示输出一整行
[root@station mnt]# vim tmp
[root@station mnt]# cat tmp 
Please input a number!
[root@station mnt]# awk '{print $0}' tmp 
Please input a number!
####显示一个字段
[root@station mnt]# awk '{print $1}' tmp 
Please
####显示第二个字段
[root@station mnt]# awk '{print $2}' tmp 
input
####显示两个字段
[root@station mnt]# awk '{print $1,$2}' tmp 
Please input
####指定分隔符
[root@station mnt]# awk -F " " '{print $1,$2}' tmp 
Please input

awk常用变量

awk '{print FILENAME,NR}' path/	##输出文件名,和当前操作的行号
awk -F: '{print NR,NF}' path/		##输出每次处理的行号,以及当前以":"为分隔符的字段个数
BEGIN{}:	###读入第一行文本之前执行的语句,一般用来初始化操作
{}:逐行处理
END{}:		###处理完最后以行文本后执行,一般用来处理输出结果
awk -F: 'NR % 2 == 0 {print}' /etc/passwd	##偶数行
[root@station mnt]# awk -F ":" '{print FILENAME,NR}' /etc/passwd 
/etc/passwd 1
/etc/passwd 2
/etc/passwd 3
/etc/passwd 4
/etc/passwd 5
/etc/passwd 6
/etc/passwd 7
...
[root@station mnt]# awk -F ":" '{print NR,NF}' /etc/passwd 
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
...
[root@station mnt]# awk 'BEGIN {a=1;print a+2}'
3

例1:打印/etc/passwd文件中UID<3的用户,输出用户名和UID

[root@station mnt]# awk -F: '$3 >= 0 && $3 < 3 {print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2

例2:统计文本总字段数

在这里插入图片描述

在这里插入图片描述

if单分支语句
##统计登陆shell为bash的用户

[root@station mnt]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd
2

###统计UID小于等于500的用户个数

[root@station mnt]# awk -F: 'BEGIN{i=0} {if($3>=0 && $3<=500){i++}} END{print i}' /etc/passwd
31

if双分支结构
####分别统计UID小于等于500和大于500的用户个数

[root@station mnt]# awk -F: 'BEGIN{i=0;j=0} {if($3>=0 && $3<=500){i++}else{j++}} END{print i,j}' /etc/passwd
31 9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sedawk是用户、程序员和管理员应用的工具。之所以称为sed是因为它是一个流编辑器(stream editor),用于对许多文件执行一系列的编辑操作。awk是根据它的开发者Aho、Weinberger和Kernighan命名的。awk是一种编程语言,它可以使你很容易地处理结构化数据和生成格式化报告。第二版介绍了awk的POSIX标准,同时介绍了一些可免费使用的以及商业版的awk。 本书在一开始就给出了一个概述和指南,论述了从grep到sed再到awk不断改进的功能。sedawk具有相同的命令行语法,以脚本的形式接收用户的命令。因为所有这三个程序都使用UNIX正则表达式,因此书用一章的篇幅来介绍UNIX的正则表达式语法。 然后,本书介绍如何编写sed脚本。从编写几行简单的脚本开始,学习进行手工编辑操作的其他基本命令和高级命令,以及由此引入的简单程序结构。这些高级命令包括用于处理保持空间、即一个临时缓冲区的命令。 本书的第二部分经过广泛的修订,包括了POSIX awk,以及3个可免费使用的和3个商业版的awk。本书介绍了awk语言的主要特点以及如何编写简单的脚本。你还能了解到: * 通用的程序结构 * 如何使用awk的内部函数 * 如何编写用户的定义函数 * awk程序的调试技术 * 如何开发一个处理索引的应用程序,该程序演示了awk的强大功能 * 得到不同awk版本的FTP和联系信息 本书还包含了一组用户提供的程序,这些程序展示了广泛的sedawk程序风格和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值