Linux文件处理三剑客整理内容(详细)

sed :stream Editor(流式文本编辑器)
什么是sed?
sed流式编辑器,一行行的处理命令,自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

为何用sed?
sed 对比vim
1、sed可以把处理文件的规则先写好,然后用同一套规则编辑多个文件而vim只能一个个编辑 ===》用一套规则处理多个文件
2、 sed处理文件,一次只处理一行,及同一时间内存中只有稳健的一行内容,所以无论文件多大,都不会对内存造成过大的压力 ====》用于处理大文件

如何用sed?
sed -选项 ‘规则’ 文件名(自带一个默认输出)
选项:
-n:取消默认输出
-i:将输出到屏幕中的结果(即规则处理的和默认输出的结果)覆盖到原文件当中 ps:调节完毕之后再使用此命令
-e 允许多项编辑
-r 支持扩展元字符
-f 指定sed脚本文件名

规则:定位+命令
定位方式:
没有定位的默认定位所有行,可以用行号(数字)进行定位,也可以用正则表达式进行定位

行号(数字)定位:利用数字来定位
示例:
sed ‘1p’ a.txt
输出结果:第一行被重复输出了遍到屏幕上(原理:将文件第一行内容输出到屏幕上,默认输出整个文件内容到屏幕上)

sed ‘1,3p’ a.txt
输出结果为:第一到三行都被重复输出到屏幕上 (原理:将文件第一行内容到第三行内容输出到屏幕上,默认输出整个文件内容到屏幕上)

sed ‘3;5p’ a.txt
输出结果为:第三行内容,第五行内容被重复输出到屏幕上(原理:将文件第三行内容,第五行内容输出到屏幕上,默认输出整个文件内容到屏幕上)

正则定位:两个左斜杠,斜杠中间是筛选条件
sed ‘/^egon/p’ a.txt
输出结果为:以egon开头的行重复打印一遍

命令:
a 在当前行后添加一行或多行
c 用新文本修改(替换)当前行中的文本
i 在当前行之前插入文本
l 会用$符号标识出文件中看不到的字符的位置
p:文件输出到屏幕
d:删除内存中的文件,通常输出结果为空
s:替换 用法:s/要替换的内容/替换的内容/
与s一起使用的是g和i
g 在行内进行全局替换
i 忽略大小写(跟s一起使用时)
n 把下一行内容读入模式空间(sed内置的一个缓冲区),后续的处理命令处理的都是刚读入的新内容
q 结束或退出sed,不会将后续内容读入模式空间
r 从文件中读
! 对所选行以外的所有行应用命令
w 将行写入文件
y 将字符转换为另一字符(不支持正则表达式),y/egon/1234/ e->1 g->2 o->3 n->4

​拓展内容:
sed 有两个内置的存储空间:
模式空间(pattern space)
如你所知,模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。

保持空间(hold space)
保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。

每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。
模式空间与保持空间的操作命令

x:命令x(exchange) 用于交换模式空间和保持空间的内容
​
h:模式空间复制/覆盖到保持空间
H:模式空间追加到保持空间
​
g:保持空间复制/覆盖到模式空间
G:保持空间追加到模式空间
​
n:读取下一行到/覆盖到模式空间
N:将下一行添加到模式空间
​
​
d:删除pattern space中的所有行,并读入下一新行到pattern space中

AWK:用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个 或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix 下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用(擅长处理有规律的文本文件,主要做一些格式化处理
用法
AWK -选项 ‘规则’ 文件路径 规则=定位+命令 命令要用花括号括起来

选项:
-F:指定分隔符,指定空格为分隔符时,需要将空格用引号引起来。

定位:
行号定位:
NR == 1

记录与字段相关的内部变量
$0: 输出整行内容
NR: 记录号,每处理一条记录,NR的值加1(也可作为指定行号的指令来用)
NF: 保存记录的字段数,最大为100
FS:输入字段分隔符,(也就是指定什么符号为分隔符进行处理)
OFS:输出字段分隔符,(指定什么符号作为处理结果的分隔符 也可简写成 -F ,若指定空格为分隔符时,需用引号引起来)

格式化输出:

==============print函数===================
[root@egon ~]# date | awk '{print "月:",$2,"\n年:",$1}': 09月 
年: 2020[root@egon ~]# 
[root@egon ~]# awk -F: '{print "用户名:",$1,"用户id:",$3}' /etc/passwd================printf函数===================
[root@egon ~]# awk -F: '{printf "用户名:%s 用户id:%s\n",$1,$3}' /etc/passwd
[root@egon ~]# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd%s 字符类型
%d 数值类型
占15格的字符串
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n

AWK -F:’{print $1,$3}’ /etc/passwd
运行结果:将/etc/passwd文件中以:为分隔符的第一段,第三段打印出来
工作原理:
(1)awk会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行也可称为一个记录,行的边界是以换行符作为结束
(2)然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段,注意:如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格
(3)**使用print函数打印,如果$1$3之间没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号,**该逗号与awk的内置变量OFS保持一致,OFS默认为空格,于是以空格为分隔符输出$1和$3
我们可以指定:awk -F: ‘BEGIN{OFS="-"}{print $1,$3}’ /etc/passwd (以-为分隔符输出$1和$3)
(4)输出之后,将从文件中获取另一行,然后覆盖给$0,继续(2)的步骤将该行内容分隔成字段。。。继续(3)的步骤
该过程一直持续到所有行处理完毕

示例:
AWK -F: ‘NR >= 3 && NR <= 5 {print $1,$3}’ /etc/passwd
运行结果:将/etc/passwd文件中大于第三行并小于第五行的文件内容以:为分隔符的第一段,第三段打印出来

AWK -F:‘NR <= 3 || NR >= 8{print$1,$3}’ /etc/passwd
运行结果:将/etc/passwd文件中小于第三行或大于第8行的文件内容以:为分隔符的第一段,第三段打印出来

正则定位:
没有定位代表定位所有行
AWK -F:’/root/{print $0}’ test.txt
运行结果:将test.txt文件中有/root/的行整行打印出来

AWK -F:’$6 ~ /root/{print $0}’ test.txt
运行结果:将test.txt文件中第六段有/root/的行整行打印出来

AWK -F:’$6 !~ /root/{print $0}’ test.txt
运行结果:将test.txt文件中第六段没有/root/的行整行打印出来

AWK -F:"$1 == ‘/root/’ {print $0}" test.txt
运行结果:将test.txt文件中第六段没有/root/的行整行打印出来

awk 的好处是可以将文件格式化处理,同时配上一些命令可以更详细的处理文件
命令:

三、grep
grep -选项 ‘过滤规则’ 文件名,它的家族还有egrep,支持更多的正则表达式元字符,fgrep,固定的grep,也可以称之为fast grep,按字面解释所有字符

选项:
-n:–line-number 在过滤出的每一行前面加上他=它在文件中相对应的行号
-o --only-macthing 只显示匹配的内容
-i:–ignore-care 忽略大小写
–color: 加颜色
-q, --quiet, --silent 静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容,返回0为找到了,返回1没找到,返回2找不到指定文件
-l:–files-with-matches 如果匹配成功,则将文件名打印出来,失败则不打印通常与-rl一起用
-r,-R:–recursive 递归
-v 取反,(只显示不匹配的行,也就是过滤掉grep的结果)
-c, --count 如果匹配成功,则将匹配到的行数打印出来
-E 等于egrep,扩展

示例:
grep ‘^root’ /etc/passwd
输出结果:root:x:0:0:root:/root:/bin/bash(在/etc/passwd文件中输出以root开头的行)
grep -n ‘bash$’ /etc/passwd
输出结果:1:root:x:0:0:root:/root:/bin/bash(在/etc/passwd文件中输出以bash结尾的行,并标出他在文件中的位置)
[root@localhost ~]# ps aux |grep ssh
输出结果为

root 1011 0.0 0.4 112900 4312 ?  Ss 16:31 0:00 /usr/sbin/sshd -D
root       1262  0.0  0.5 158904  5608 ?        Ss   16:31   0:00 sshd: root@pts/0
root       1377  0.0  0.0 112824   972 pts/0    R+   17:12   0:00 grep --color=auto ssh

ps aux : 查看系统上运行的进程
有上述代码可知grep也支持管道符号,即三剑客都支持管道符号,都支持正则表达式

kill -9 进程号:强制杀死一个进程

猜你喜欢

转载自blog.csdn.net/givenchy_yzl/article/details/113995483