sed操作 --实现过滤和替换
1、可以进行查询操作
命令 | 含义 |
sed 可选项 目标文件 | 对目标文件 进行 过滤查询 或 替换 |
可选参数
可选项 | 英文 | 含义 |
p | | 打印 |
$ | 代表 最后一行 | |
-n | 仅显示处理后的结果 | |
-e | expression | 根据表达式 进行处理 |
2、搞一些数据 6.txt
aaa java root
bbb hello
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt
3、列出6.txt中的3~5行的数据
cat 6.txt | sed -n -e '3,5p'
假如没有学过sed可以这么干:
head -5 6.txt | tail -3
显示第一行到最后1行的数据:
cat 6.txt | sed -n -e '1,$p'
显示第二行到最后一行
cat 6.txt | sed -n -e '2,$p'
显示行号:
可选项 | 含义 |
= | 打印当前行号 |
打印第三行到第五航的数据,显示行号
一种写法,没有使用sed ,而是使用了cat -n
cat -n 6.txt|sed -n -e '3,5p'
另一种写法:
sed -n -e '3,5=' -e '3,5p' 6.txt
sed进行查找:
// 需求是查找每一行中包含login的数据
cat 6.txt | sed -n -e '/login/p'
cat 6.txt| grep login
[root@bigdata01 gaoji]# grep -n login 6.txt
4:ddd root nologin
6:fff ROOT nologin
[root@bigdata01 gaoji]# awk '/login/' 6.txt
ddd root nologin
fff ROOT nologin
[root@bigdata01 gaoji]# sed -n -e '/login/p' 6.txt
ddd root nologin
fff ROOT nologin
不区分大小写的查找,使用 I 参数 (大i)
Sed 中可以使用正则表达式:
cat 6.txt|sed -n -r -e '/r+t/p'
-r 后面可以跟正则表达式 regex
r+ 表示 r 可以出现一次到多次 r后面必须跟上t
思考: 在这个里面如何写一个正则表达式,表示以r开头,以t结尾
a* a出现0次到多次
a+ a出现1次到多次
Sed 进行删除操作:
先学习一个新命令 nl 可以查看文件,该文件自动添加行号
选项使用d 进行删除
显示除了3到5行的所有数据:
nl 6.txt | sed -e '3,5d'
nl 6.txt | sed -e '3,$d' // 只显示前两行数据了
[root@bigdata01 datas]# cat 6.txt | sed -e '3,$d' | cut -d ' ' -f 2
java
hello
还可以使用sed修改内容
参数 | 英文 | 含义 |
i | insert | 目标前面 插入内容 |
a | append | 目标后面 追加内容 |
1、在6.txt的第一行前面插入 xxxxxxx,并显示行号
nl 6.txt | sed -e '1i xxxxxxxx'
2、在6.txt的第二行后面插入 SSSSSSS,并显示行号
nl 6.txt | sed -e '2a SSSSSSSS'
sed还可以进行数据的替换
s/oldString/newString/ | replace | 替换 |
把6.txt中的nologin替换成为huawei,并显示行号
cat 6.txt | sed -e 's/nologin/huawei/' // 按照字符串进行替换
cat 6.txt | sed -e '3c laoyan' // 按照行进行替换
以上的替换都是没有修改原来的数据的,sed也可以直接对原数据进行直接更改。
直接更改数据,首先数据进行备份
cp 6.txt 7.txt
sed -i -e 's/nologin/huawei/' 7.txt
sed -i -e '2c laoyanlaoyan' 7.txt
sed -i -e '1,2d' 7.txt // 真删除数据
Sed综合练习:获取本机的IP地址
ifconfig 在 linux上可以获取本机的IP信息
ipconfig 在windows上可以获取IP地址信息
因为我们使用的是mini版,没有这个服务:
yum search ifconfig
yum install -y net-tools.x86_64
安装完毕就可以使用ifconfig 这个服务了。
符号 | 含义 | |
^ | 表示开始 | ^aaa 表示以 aaa 开始 |
$ | 表示结尾 | bbb$ 表示以 bbb 结尾 |
.* | 表示任意 | ^.* 表示以 任意字符开始 |
需求是:通过ifconfig 命令获取我的IP地址
ifconfig ens33 | grep 'inet ' | sed -e 's/inet //' | sed -e 's/ netmask.*//'
也可以这么写: \s 表示空格 * 表示0次到多次
ifconfig ens33 | grep 'inet ' | sed -e 's/\s*inet //' | sed -e 's/\s*netmask.*//'
思考:
ip addr 获取ip地址,怎么写?
ip addr | grep ens33 |grep 'inet' | sed -e 's/\s*inet //' | sed -e 's/\/.*//'
6、split 文件切割
创造数据:拷贝一个/etc/services
cp /etc/services $PWD
mv services big.txt
ll 查看文件的大小
按照字节进行切割:
split -b 100k big.txt
split -l 3000 big.txt
查看大小:
du -h /home/scripts/datas/xaa ==100k
ll
wc -c 文件名
删除所有的 x开头的文件
rm -rf ./x*
查看一个文件中有多少行
wc -l xaa
7、tr 替换和删除
tr 被替换的字符 新字符 是translate 的缩写
搞点数据:8.txt
laoyan
HELLO
abc12def34g
替换:
cat 8.txt | tr '[a-z]' '[A-Z]'
删除操作:
使用tr 进行一个单词计数的练习
9.txt
hello,world,hadoop
hive,sqoop,flume,hello
kitty,tom,jerry,world
hadoop
第一种方案:
[root@bigdata01 scripts]# cat 9.txt | tr ',' ' '|wc -w
12
第二种方案:
将单词中的,替换为换行符
cat 9.txt | tr ',' '\n'
//接着使用排序,去重等操作
cat 9.txt | tr ',' '\n' | sort | uniq
// 接着可以进行单词重复记录的数据
cat 9.txt | tr ',' '\n' | sort | uniq -c
也可以这么写:
cat 9.txt | tr ',' '\n' | sort -u | wc -l
8、uniq 去重
uniq 命令用于检查及删除文本文件中重复出现的行,一般与 sort 命令结合使用
造一些数据10.txt
张三 98
李四 100
王五 90
赵六 95
麻七 70
李四 100
王五 90
赵六 95
麻七 70
cat 10.txt | sort | uniq
9、tee 可以将数据输送到各个文件中 ,跟一个水管一样
cat 10.txt | sort | uniq -c | tee a.txt b.txt c.txt
查看一个文件夹中所有文件的大小:
du -h *
或者
du -h -a