0412预习 直播笔记

sed

0412预习 直播笔记_第1张图片
grep命令还不够强大,它只能用于查找,而不能进行替换。这里就需要用到sed以及awk命令了,他们能把替换的文本输出到屏幕上,而且还有其他丰富的功能。它们都是流式编辑器。是针对文本的行来进行操作的。

sed 格式为 sed -n '/n/'p filename

1.打印某行

sed -n 'n'p filename

$
2,5 2至5行
5,$ 5至最尾行

在这里插入图片描述
2.打印包含特殊字符的行

sed -n '/root/'p mm.txt

0412预习 直播笔记_第2张图片
sed也是支持. * 和+的 需要脱义前面加\的
0412预习 直播笔记_第3张图片
如果不想脱义 前面加r
例如 sed -nr '/o+t/'p mm.txt
0412预习 直播笔记_第4张图片
3.过滤字符串1或者字符串2(都匹配 会打印俩次 )
sed -nr '/root|var/'p mm.txt
0412预习 直播笔记_第5张图片
-e 也是或者的意思 可多次使用
0412预习 直播笔记_第6张图片
4.不区分大小写
sed -n '/n/'Ip mm.txt
0412预习 直播笔记_第7张图片
5.删除某些行 (只删除打印 文件没修改)
sed '1,20’d mm.txt
0412预习 直播笔记_第8张图片
删除所有字母 (其实就是个替换为空的过程)
0412预习 直播笔记_第9张图片
6.-i 直接修改文件的内容

0412预习 直播笔记_第10张图片
7.替换功能(会全部打印 )
sed ‘n1,n2s/x1/x2/g’ filename(n1,n2 不加 指全行)
正则表达式 不脱义前需加 -r
0412预习 直播笔记_第11张图片
8.调换字符串的位置
格式为 sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' //sed命令支持管道符,使用小括号把要替换的字符打包成一个整体。
.* 贪婪匹配 一直会匹配到最后
0412预习 直播笔记_第12张图片
9.所有字符串前添加字符

sed -r 's/(.*)/aaa:&/' mm.txt 
&表示括号内的整体

0412预习 直播笔记_第13张图片

awk

0412预习 直播笔记_第14张图片
1.截取文档中的某段
打印头10行的第一段
head -10 mm.txt |awk -F ': ' '{print $1}' //-F用来指定分隔符。不加-F选项,默认使用空格或者tab为分隔符,print为打印的意思。 $1表示打印第1字段 $0表示整行
0412预习 直播笔记_第15张图片
2.可以打印多段’{print $1,$2,$4}’
可自定义分隔符 ‘{print $1’’#’’$2’’#’’$4}’ 自定义分隔符用双引号 引起
0412预习 直播笔记_第16张图片
3.匹配字符或字符串
awk ‘/oo/’ mm.txt
awk -F ':' '$1 ~ /oo/'mm.txt 匹配 第一段oo字符的行打印出来
在这里插入图片描述
支持正则表达式 第一段一个或者一个以上的o的行

0412预习 直播笔记_第17张图片
扩展 awk 不需要脱义字符

  1. awk -F ‘:’ ‘$3==0’ test.txt //这里表示打印第3段等于0的行,要想等于必须使用2个=,不然就是赋值了。
    在这里插入图片描述

    == 等于 >大于>=大等于
    < 小于
    <= 小等于
    != 不等于

awk -F ‘:’ ‘$3==$4’ mm.txt 打印第三段和第四段相同的行

5.awk的内置变量
OFS 定义输出分隔符的
0412预习 直播笔记_第18张图片
NR 表示行号
0412预习 直播笔记_第19张图片
NF 表示用分隔符分隔后一共多少段
0412预习 直播笔记_第20张图片
NR 作为判断条件
0412预习 直播笔记_第21张图片

直播笔记

awk语法结构:
awk -F ‘:’ ‘BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}’ filename

打印某行到某行之间的内容
sed -n ‘/tss/,/sas/p’ /etc/passwd

sed转换大小写

  1. 把每个单词的第一个小写字母变大写:
    sed ‘s/\b[a-z]/\u&/g’ filename
  2. 把所有小写变大写:
    sed ‘s/[a-z]/\u&/g’ filename
  3. 大写变小写:
    sed ‘s/[A-Z]/\l&/g’ filename

sed在某一行最后添加一个数字
sed -r ‘s/(^a.)/\1 12/’ test
sed -r 's/^a.
/& 12/’ test

打印1到100行含某个字符串的行
sed -n ‘1,100{/abc/p}’ 1.txt

awk 中使用外部shell变量
a=2; echo “a?️c:d”|awk -F “:” -v get_a=$a ‘{print $get_a}’

awk 合并一个文件

awk ‘NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$1]}’ 1.txt 2.txt

说明:
awk ‘{print NR,FNR}’ 1.txt 2.txt //首先理解NR和FNR的不同(awk支持同时操作多个文件内容)
当NR==FNR其实就是第一个文件的内容
当NR>FNR,其实就是第二个文件的内容

把一个文件多行连接成一行
方法一:
a=cat file;echo $a
方法二:
awk ‘{printf("%s ",$0)}’ file
方法三:
cat file |xargs

awk中gsub函数的使用
awk ‘gsub(/www/,“abc”)’ /etc/passwd // passwd文件中把所有www替换为abc
awk -F ‘:’ ‘gsub(/www/,“abc”,$1) {print $0}’ /etc/passwd // 替换$1中的www为abc

awk 截取指定多个域为一行
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in seq 1 7
do
awk -F ‘:’ -v a=$i ‘{printf $a " "}’ /etc/passwd
echo
done

过滤两个或多个关键词
grep -E ‘123|abc’ filename // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc’ filename //用egrep同样可以实现
awk ‘/123|abc/’ filename // awk 的实现方式

awk用print打印单引号
awk ‘BEGIN{print "a’"’"‘s"}’
awk ‘BEGIN{print "a’’‘s"}’
awk ‘BEGIN{print “a"s”}’

你可能感兴趣的:(学习笔记,0412预习直播笔记)