Linux-sed和awk
SED 搜索、字符串替换
搜索
sed -n '3p' file 对第三行的内容print出来
sed -n '3,$p' file 对第3行到最后的所有行print出来
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed -n '/字符串/p' file 过滤字符串
sed -n '/字符串/,/字符串/p' file 过滤字符串区间
⚡动作

eg. sed -n '/root/p' /etc/passwd 打印行
sed -n '/root/d' /etc/passwd 删除行
sed -n '3a/root/' /etc/passwd 追加
sed -n '3i/root/' /etc/passwd 插入
字符串替换
😀sed(stream editor) 是一个流处理编辑器,是一个“非交互式的”面向字符流编辑器,能同时处理多个文件多行的内容。
能帮助我们自动处理文件、分析日志文件、修改配置文件等
1、可以不对原文件进行改动,把整个文件的内容输出到屏幕
2、可以把匹配到的内容输出到屏幕
3、还可以对原文件进行改动,但不会把结果返回到屏幕上
❤️sed 's/:/\t/g' /etc/passwd 以制表符(tab键)替换冒号
s:replace替换 g:global全局

❤️grep -n 'login' /etc/passwd 找到关键字所在的行数
sed -n '100,110p' /etc/passwd 把100-110这几行打印出来
❤️nl /etc/passwd1 | sed '1,10d' 删除1-10行
❤️sed '/^_.*/d' /etc/passwd 删除以_开头的行,^表示以什么开头
❤️sed '2d' example 删除example文件的第二行。
❤️sed '2,$d' example 删除example文件的第二行到末尾所有行。
❤️sed '$d' example 删除example文件的最后一行。
❤️sed '/test/'d example 删除example文件所有包含test的行。
❤️$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
AWK
AWK 是一种用于处理文本的编程语言工具。这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。
如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
命令格式
awk --version 查看版本awk 【options】 'pattern {action}' file file可以来自管道、多个文件、标准输入执行过程
1.awk -F: '{print $1}' /etc/passwd
读一行,赋值给$0,然后才输出的第一列
2.awk -F ":" 'NR>2&&NR<5{print$1,$3}' awkfile.txt
读取第一行,看是否NR(number row正确的是number of record,但是感觉number row更形象一点)大于2小于5,
是的话输出,不是的话继续读取下一行,直至结束
3.awk每处理一行,就会输出一遍“hello”,并没有输出文件内容

区域和记录
filed record
❤️区域filed : $0,$1,$2
$取,引用
$0 : 整行,一个记录(包括$1、$2、$3等等)
$NF表示最后区域
awk -F ":" 'NR>2&&NR<5{print$1,$3,$NF}' awkfile.txt

❤️record 记录
每一行都是一个记录,默认回车换行是一个记录结束的标志
(区域是纵向分块,$1-$6;记录是横向分块,一行一行的,RS)

RS record of separator 记录分隔符
awk认为文件是一串字符串,中间有“\n”,设置RS的值是“\n”
一般不会给RS赋值
ORS output record separator 输出的时候分隔符
正则表达式
^ 以什么开头
$ 以什么结尾
~ 匹配记录(整行)
awk '$0 ~ /^root/' /etc/passwd 操作的那行匹配上以root开头
BEGIN模块
awk 'BEGIN{RS="/"}{print NR,$0}' awkfile.txt 分隔符是“/”,打印出行数和该行
awk需要先执行完begin模块,才对文件处理。一般用来定义内置变量-预定义变量,FS、RS
awk 'BEGIN{print "hello world!"}'
END模块
awk '{print $0} END{print "end of the file"}' awkfile.txt
正常输出,最后加个end of the file
awk 'BEGIN{print "hello world!"}{print $0} END{print "end of the file"}' awkfile.txt
只输出一次“hello world!”,在所有输出的最开头
例子
❤️awk '/root/' /etc/passwd 包含root的行,过滤出来

❤️-F 指定分隔符
1. awk -F: '{print $1}' /etc/passwd 以冒号作为分隔符,打印第一列
awk -F: '{print NR,$1}' /etc/passwd 以冒号作为分隔符,打印行号,和第一列
2.awk 'BEGIN{FS=":";OFS="----"}{print $1,$NF}' /etc/passwd (与下面效果相同)
awk 'BEGIN{FS=":"}{print $1"------"$NF}' /etc/passwd
❤️awk -F: '$3>300 {print $0}' /etc/passwd 条件判断 $3大于300打印整行
❤️awk -F: '{ if($3==0){print $1 " is adminisitrator"} }' /etc/passwd if判断 如果$3等于0,打印$1是管理员
❤️awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd if判断 成立执行一个动作,不成立执行一个动作
awk -F: '{ if($3>0 && $3<1000){i++}else{a++}} END {print i," ",a}' /etc/passwd if判断 统计虚拟用户和普通用户
❤️awk -F: '{i=1; while(i<=NF){print $i; i++}}' /etc/passwd while循环 每个元素自成一行
❤️awk -F: '{ for(i=1;i<=10;i++) {print $0} }' passwd for循环
❤️awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }' /etc/passwd 数组 以最后一列当索引
❤️ss -an|awk '/:80/{tcp[$2]++} END {for(i in tcp){print i,tcp[i]}}' 数组 站访问状态统计<当前时实状态ss>*
❤️sss -an|awk -F ':' '/:80/{ips[$(NF-1)]++} END {for(i in ips){print i,ips[i]}}' 数组 统计当前访问的每个IP的数量<当前时实状态 netstat,ss>*
浙公网安备 33010602011771号