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,就打印它。

❤️$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。依次执行。

AWK

AWK 是一种用于处理文本的编程语言工具。这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。

如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

命令格式

尽管操作可能会很复杂,但命令的语法始终是:awk '{pattern + action}' 或者 awk 'pattern {action}'  找谁干什么
 
pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令
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>*

 

 

posted @ 2023-04-15 18:46  仰望神明  阅读(15)  评论(0)    收藏  举报