分类: LINUX
2024-12-17 13:47:09
01
关于Linux三剑客
grep:过滤关键字信息数据。主要是用于查文本内的数据
sed :对文本数据进行编辑,修改原文件内容
awk:对文件数据过滤,提取,并且能实现,格式化输出
awk对文件数据处理后,还能更美观的展示数据
02
sed是什么
sed软件本身
sed提供的加工的命令
给sed提供的源数据
sed [选项] [sed内置命令字符] [输入文件] 说明: 1.注意 sed 软件及后面选项,sed 命令和输入文件,每个元素之间都至少有一个空格 2.为了避免混淆,文本称呼sed为sed软件.sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的 options(选项)区分,故称为sed命令. 3.sed-commands 既可以是单个sed 命令,也可以是多个sed命令组合. 4.input-file(输入文件)是可选项,sed 还能够从标准输入或管道获取输入
语法 sed替换字符数据 s替换指令 #替换前的数据(正则)#替换后的数据# sed 's#替换前的数据#替换后的数据#' file.txt
概括流程: sed 软件从文件或管道读取一行,处理一行,输出一行;再读取一行.再处理一行.在输出一行....
sed默认修改的是模式空间内的数据 (简单大白话,sed读取了一行文本数据,放入到内存里进行修改,修改的结果默认不会写入到文件中,只是在内存里修改,且打印让你看到修改的结果) 吧修改的结果写入到文件 就得借助参数的功能 -i 把sed处理的结果,写入到文件,且不在终端打印了 sed -i 's#替换前的数据#替换后的数据#' file.txt
options[选项] 解释说明 -n 取消默认的 sed 软件的输出,常与 sed 命令的 p 连用 -e 一行命令语句可以执行多条 sed 命令 -f 选项后面可以接 sed 脚本的文件名 -r 使用正则拓展表达式,默认情况 sed 只识别基本正则表达式 -i 直接修改文件内容,而不是输出终端,如果不使用-i 选项 sed 软件只是修改在 内存中的数据,并不影响磁盘上的文件
sed提供了很多功能的指令 在某一行插入数据 替换字符数据 sed-commands[sed 命令] 解释说明 a 追加,在指定行后添加一行或多行文本 c 取代指定的行 d 删除指定的行 D 删除模式空间的部分内容,直到遇到换行符\n 结束操作,与多行模式相关 i 插入,在指定的行前添加一行或多行文本 h 把模式空间的内容复制到保持空间 H 把模式空间的内容追加到保持空间 g 把保持空间的内容复制到模式空间 G 把保持空间的内容追加到模式空间 x 交换模式空间和保持空间的内容 l 打印不可见的字符 n 清空模式空间,并读取下一行数据并追加到模式空间 N 不清空模式空间,并读取下一行数据并追加到模式空间 p 打印模式空间的内容,通常 p 会与选项-n 一起使用 P(大写) 打印模式空间的内容,直到遇到换行符\你结束操作 q 退出 sed r 从指定文件读取数据 s 取代,s#old#new#g==>这里 g 是 s 命令的替代标志,注意和 g 命令区分 w 另存,把模式空间的内容保存到文件中 y 根据对应位置转换字符 :label 定义一个标签t 如果前面的命令执行成功,那么就跳转到 t 指定的标签处,继续往下执行后 续命令,否则,仍然继续正常的执行流程
sed增加字符命令
"a":追加文本到指定行,记忆方法:a 的全拼是 apend,,意思是追加 添加一行或多行文本 3a 表示在第三行下面追加数据 "i":插入文本到指定行前,记忆方法:i 的全拼是 insert,意思是插入 添加一行或多行文本 3i 在第三行上面插入数据
单行增加命令
行
sed'行号 sed指令 你想添加的字符数据’源文件在文件第二行后,插入数据,‘今天又是美好的一天’
[242-yuchao-class01 root ~]#sed '2 a "今天又是美好的一天" ' t1.log My name is yuchao. I teach linux. "今天又是美好的一天" I like play computer game. My qq is 877348180. My website is http://
在第二行前,插入数据
sed '2 i 今天雾霾比较大' t1.log
增加的数据存在换行
cat >>my.log<<EOF 你好 我好 他也好 EOF
用法如下 [242-yuchao-class01 root ~]#echo -e "hello\nworld\n你好\n我也好" > hello.log [242-yuchao-class01 root ~]#cat hello.log hello world 你好 我也好
cat、还是echo,都只能往文件末尾追加内容。
而sed是按行处理文本,可以指定要处理的行,也就是在指定行插入字符数据。
使用\n添加多行数据
给t1.log 开头,添加两行数据 加油 奥力给 [242-yuchao-class01 root ~]#sed -i '1 i 加油\n奥力给' t1.log [242-yuchao-class01 root ~]#cat -n t1.log 1 加油 2 奥力给 3 My name is yuchao. 4 I teach linux. 5 I like play computer game. 6 My qq is 877348180. 7 My website is http://
练习sed追加配置文件信息(单行)
1.练习,修改nginx配置文件,在第39行插入新数据 listen 81; 只修改,且终端上看到修改结果,但是不修改文件 sed '39 i listen 81;' /etc/nginx/nginx.conf sed -i '39 i listen 81;' /etc/nginx/nginx.conf
修改sshd_config实战
例如我们在系统初始化优化时,需要修改sshd服务端设置,需要加入如下多行配置
Port 25515 # 改端口 PermitRootLogin no # 不允许root登录 PerminEmptyPasswords no # 不允许空密码 UseDNS no # 不做主机名解析,加速ssh连接 GSSAPIAuthentication no # 不做主机名解析,加速ssh连接
修改配置之前先备份源文件
源文件 /etc/ssh/sshd_config
备份,添加ori后缀 cp /etc/ssh/sshd_config{,.ori}
sed写入多行配置 在开头加入这些配置
sed -i '1 i Port 25515\nPermitRootLogin no\nPerminEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
d 删除指定的行
d 命令,表示删除字符,delete意思
sed默认是多行处理所有文本,如果不指定范围,sed默认是删除所有文本行数据了
sed 删除第二行数据
[242-yuchao-class01 root ~]#sed '2 d' t1.log
sed删除1到4行
sed '1,4d' t1.log
删除第三行数据 sed '3 d' t1.log 删除文件的3到6行 sed '3,6 d' t1.log 删除第三行开始,向下2行 sed '3,+2 d' t1.log 删除奇数行 1,3,5,7,9 sed '1~2 d' t1.log 删除偶数行 2,4,6,8 sed '2~2 d' t1.log 保留前三行 [242-yuchao-class01 root ~]#sed -e '4,$ d' t1.log 找到game那一行,且删掉 [242-yuchao-class01 root ~]#sed '/game/ d' t1.log 删除game这一行到结尾 [242-yuchao-class01 root ~]#sed '/game/,$ d' t1.log 删除文件中所有包含game的行,以及它下一行 [242-yuchao-class01 root ~]#sed '/game/,+1 d' t1.log
sed提供打印的命令是p
元数据
[yuchao-linux01 root ~]#cat chaoge.log My name is yuchao. I teach linux. I like play computer game. My qq is 877348180. My website is http://
删除文件所有行
sed不指定行号的话,默认匹配所有行,执行d删除命令 sed '行号 d命令' 文件 sed 'd' file
删除文件第2行
sed'2 d'file
删除1到3行
sed'1,3 d'
删除第1、2、4行
语法是用分号,隔开多个命令,多次删除
sed'1 d;2 d;4d;'t1.log
删除game的行
sed'/game/d't1.log
删除game和http的行
也就是删除了2个指定的行
sed'/game/d;http/d'1t.log
删除My开头的行
sed'/^My/d't1.log
sed忽略大小写的指令
sed提供了 大写的I 指令 用于忽略大小写
sed'/^My/ld't1.log
删除以.结尾的行
sed'/.$/d't1.log
删除第二行到qq的行
sed'2,7d't1.logsed'2,/qq/d't1.log
删除2和5两行
sed'2d;5d't1.log
删除2到5行
sed'2,5d't1.log
删除3到尾行
sed'3,$d't1.log
删除偶数行(步长)
seq 1 10|sed‘2~2d'
删除奇数行(步长)
seq 1 10 |sed'1~2 d'
感叹号取反
Id sed的忽略大小写命令 !d 结果取反
除了有字符yuchao的行,其他都删除
[242-yuchao-class01 root ~]#sed '/yuchao/!d' t1.log My name is yuchao. My website is http://
删掉除了My开头的行
sed'/^My/!d't1.log
替换整行命令(c)
c 把选定的行改为新的文本。 把11行替换为新数据 , 睡醒了 精神很饱满 语法 sed ' 11 c 睡醒了,精神很饱满 ' t1.log
替换文件的第二行,改为 "I love linux , python !"
整行全部替换 sed '2c I love linux , python !' t1.log
替换字符(s命令)
sed替换的命令解释 这个分隔符,常见有如下形式 sed 's/old_string/new_string/' sed 's#old_string#new_string#' sed 's@old_string@new_string@' 强烈建议用# sed 's#old_string#new_string#' 替换一次 sed 's/替换前字符/替换后字符/' file 全局替换,global 全局替换 sed 's/替换前字符/替换后字符/g' file s 将每一行{BANNED}中国{BANNED}中国第一处匹配的字符替换 s/old_string/new_string/ sed 's#i#I#' t1.log g 全局替换global,每一行,每一处匹配的字符都替换 s/old_string/new_string/ sed 's#i#I#g' t1.log sed 's/i/I/g' t1.log -i 选项、参数,直接修改文件 sed默认是修改内存中的模式空间数据,不会修改源文件,使用-i会修改源文件,修改磁盘上的文件数据。
测试数据
My name is yuchao. you can call me yuchao. I teach linux. I like play computer game. My qq is 877348180. My website is http:// , and another website is
字符yuchao改为老于
替换一次
[242-yuchao-class01 root ~]#sed 's#yuchao#老于#' t1.log My name is 老于. you can call me yuchao. I teach linux. I like play computer game. My qq is 877348180. My website is http://www.老于it.cn , and another website is
替换多次,全局替换
sed 's#yuchao#老于#g' t1.log
替换第三行的computer改为linux
sed '3 s#computer#linux#g' t1.log
所有的My改为His
指定my开头
注意,sed提供了忽略大小写的命令,大写的 I 注意大小写 不加忽略大小写命令的写法 sed 's#^My#His#' t1.log 添加忽略大小写的命令 sed 's#my#His#Ig' t1.log
new_name="彭于晏" 注意单引号、双引号的对变量的解析作用 [242-yuchao-class01 root ~]#sed "s#yuchao#$new_name#g" t1.log
注意别忘了扩展正则 -r参数
语法: sed软件也提供了 \(\)分组功能 使用\1引用{BANNED}中国{BANNED}中国第一个括号的数据 \2引用第二个括号的数据 sed{BANNED}{BANNED}最佳佳多记住9个分组 () \1向后引用分组数据
提取出welcome这个单词
echo 'I am teacher yuchao,welcome my linux course' | sed -r 's/^.*,(.*)m.*/\1/g' welcome
\s 表示单个空格
去头去尾法 [242-yuchao-class01 root ~]#ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n 192.168.0.242
分组提取法
sed打印命令p 打印sed正则处理后的数据
并且sed默认打印模式空间,可以用-n取消
文本,10数据 > sed 一行一行的读取,编辑 >> 打印
固定用法,只要使用到了p打印些数据,就是想输出指定数据
必然用-n取消默认打印,目的是,只看到你想p打印的那些数据
打印第二行
sed'2 p't1.log
打印前三行
sed'1,3p't1.log -n
只显示qq号那一行
[242-yuchao-class01 root ~]#sed -r '/[0-9]{9}/p' t1.log -n My qq is 877348180. my num is 1555555555.
找出http和linux的行
-e 多次编辑 [242-yuchao-class01 root ~]#sed -e '/http/p' -e '/linux/p' t1.log -n I teach linux. My website is http:// , and another website is [242-yuchao-class01 root ~]#sed '/http/p;/linux/p' -n t1.log I teach linux. My website is http:// , and another website is
作用是将sed操作结果,写入到指定文件
sed '/模式/w new_file' old_file 必须,找出computer这一行,数据写入到game2.log文件中 sed '/computer/w game2.log' t1.log -n
替换文件中所有的yuchao为老于,新数据写入 yu.log
sed's#yuchao#gw yu.log't1.log -n
-e选项用于接上sed多个命令
提取1,2,4行信息
语法 sed -e 'sed命令' -e 'sed命令' -e 'sed命令' sed -e '1p' -e '2p' -e '4p' t1.log -n
分号也用于执行多条命令,和linux基础命令一样支持这种写法。
单独提取出1,2,4行信息
sed'1p;2p;4p't1.log -nsed -e'1p'-e'2p'-e'4p't1.log -n