grep sed awk详解

article/2025/8/19 2:48:17

1、基本正则

  • 基本正则解释实例
    ^以什么开头grep ‘^1’ id.txt 匹配以1开头 cat -A
    $以什么结尾grep ‘448$’ id.txt
    ^$空行 这一行没有任何内容(空格也是)grep -n ‘^KaTeX parse error: Expected group after '^' at position 94: … grep -v '^̲’ id.txt 排除文件中空行 、#号行
    .任何一个字符,不匹配空行grep -n ‘.’ id.txt
    *前一个字符出现0次或0次以上)相当于cat,啥都输出
    . *所有内容,任何内容,任意内容、最大匹配(贪婪性)grep ‘^.*t$’ id.txt 匹配最后一个以t结尾的行
    [][abc] 1次匹配1个字符,匹配任何字符[a or b or c]grep -o ‘[abc]’ id.txt -o 显示匹配过程 grep ‘[a-zA-Z0-9]’ id.txt 推荐写法 grep ‘[a-Z0-9]’ id.txt grep -i ‘[a-z0-9]’ id.txt 不区分大小写
    [^]括号内取反[^abc] 取反,排除a,b,c,外的
    \n \t转义字符序列
    [a-z|A-Z|0-9] 匹配任何字符包含|
    

2、扩展正则 egrep

  • 扩展正则
+  |() {}
符号解释
+前1个字符连续出现1次或1次以上egrep ‘[0-9]+’ id.txt 输出数字行
|egrep ‘abc|addf’ id.txt
()被括起来的内容,表示一个整体(一个i字符)后向应引用反向引用sedegrep 'ab(c|d) ’ id.txt egrep ‘ab[cd]’ id.txt
{}连续出现o{n,m},前一个字母o 至少出现n次,最多连续出现m次,o{n}前一个字母o连续出现n次
?前一个字符连续出现0次或1次

3、grep

grep -A5 匹配接下来5行 
grep -B5 匹配接上面5行
grep -C  上下5行
ps -aux | grep sshd | wc -l 统计
ps -aux | grep -c  sshd  同wc -l
ps -aux | grep ssh | grep -v grep| wc -l排除自己grep
grep -w  22  精确匹配 22

3、sed

特点及格式

​ sed 流编辑器(stream editor)
​ sed 格式 sed -r ‘s#abc#abc|#g’ id.txt
​ sed核心功能 增删改查
​ s 替换
​ p 显示print
​ d 删除 行为单位
​ cai 增加c/a/i

sed命令执行过程

​ 四个字描述 找谁干啥
​ 找谁 你要那行
​ 干啥 增删改查
​ sed一行一行读到内存中,再一行一行判断条件
​ sed -n 取消默认输出

sed核心应用

sed  '3p' id.txt  默认输出 3p 指定行号sed -n '3p' id.txt 输出第三行 只输出第三	行sed -n  ‘1,3p’   id.txt   输出1到3行sed -n '4, $p'  匹配4行到最后一行sed 过滤sed -n ‘/10/p’  包含10显示sed -n  ‘/[45]/p’  包含4或5

sed范围过滤

sed -n ‘/102/,/105/p’ 匹配从包含“102”行到包含“105”行

实际生产环境查看log

head / tail/ less /more/sed /awk

sed -n ‘/11:02:30/p’ access.log

sed -n ‘/11:02:30/,/11:03:14/p’ access.log

不指定结尾或结尾错误直接显示到结尾

查找格式
‘2p’指定行行号进行查找
‘1,5p’指定行号范围进行查找
‘/lidao/p’类似于grep,过滤,//里面可以写正则
‘/10:00/,/11:00/p’表示范围的过滤
1,/oldboy/混合(了解)

sed 删除

查找格式
‘2d’指定行行号进行查找
‘1,5d’指定行号范围进行查找
‘/lidao/d’类似于grep,过滤,//里面可以写正则
‘/10:00/,/11:00/d’表示范围的过滤
egrep -v   '^$|#'  /etc/ssh/sshd_config  删除文件中的空行包含#号sed   -r   '/^$|#/d'  /etc/ssh/sshd_config  删除sshd文件中空行和#号
#   ! 的妙用
sed   -rn   '/^$|#/!p'  /etc/ssh/shd_config  空行#号不显示

sed 增加cai

命令含义
creplace 替代这行内容
aappend 追加向指定行或每一行追加内容(行后面)
iinsert 插入指定行或每一行插入内容(行前面)
sed   '3a 996 sss'  id.txt  第三行追加996 sss
  • 企业案列向文件追加多行内容
向config里面追加
USERDNS no
GSSAPIAUTACTION no
PeritrootLogin no`在这里插入代码片`
#方法1:
cat >>config << 'EOF'  向config 追加 并以EOF结束
USERDNS no
GSSAPIAUTACTION no
PeritrootLogin no
EOF
#方法2:sed
sed -i  '$a USERDNS no \n GSSAPIAUTACTION no \n PeritrootLogin no' config

sed 替换

替换格式
s####gs—>sub 替换
s@@@gg—>global 全局替换 sed 默认只替换每行第一个匹配的内容
s///g
sed 's#[0-9]##g'  id.txt   替换每行中数字替换为空 echo 123456 | sed -r 's#(.*)#<\1>#g'     \1 代表第一个()中内容 先保护再使用
echo  "lidao_12345"  | sed -r 's#(^.*)_(.*$)#\2_\1#g'
12345_lidao
ifconfig ens33 | sed -rn '2s#.*t (.*) n.*$#\1#gp' #192.168.0.100 

4、awk

特点及应用

awk
一门语言类似c语言
过滤统计,计算
过滤统计日志

执行过程

awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}'  /etc/passwd

在这里插入图片描述

awk 行与列

名词awk 中叫法一些说明
记录record每一行默认通过回车分割
字段,域field每一列默认通过空格分割
awk 中行和列结束标记都可以修改

awk取行

awk
NR==1取出一行
NR>=1 && NR<=5取出1到5行范围
符号> < >=<= == !=
awk  'NR==1'  /etc/passwd
AWK '/101/,/105/' /etc/passwd  
AWK  '/root/'   /etc/passwd  
awk   'NR >=1 && NR<=5' /etc/passwd

awk取列

  • -F 指定分割符 指定每一列结束标记默认是空格,连续的空格tab键

  • 数字取出某一列,注意 a w k 中 数字取出某一列,注意awk中 数字取出某一列,注意awk内容一个意思,表示取出一列

  • $0整行的内容

    ls -l |awk '{print $5,$9}' | column -t
    

awk内置变量

内置变量
NRNumber of Record 记录号,行号
NFNumber of Field 每行有多个字段(列) $NF 最后一列
FS-F: === -v FS=: Field Separator 字段分割符每个字段结束符
OFSOutField Seqarator 字段分割 awk显示每一列的时候,每一列通过什么分割 默认是空格
awk -F: '{print $1,$NF}'  /etc/passwd | column -t
awk -F: '{print $1"@@"$NF}'  /etc/passwd | column -t
awk  -F: -v OFS=: '{print $6,$2,$3,$4,$5,$6,$1}' /etc/passwd

小结

  • 行与列 名称
ip a s ens33 | awk -F"[ /]+"  'NR==3{print $3}'

awk模式匹配

  • 谁可以作为awk的条件
awk-F"[ /]+"‘NR==3{print $3}’
‘条件(动作)’
‘找谁(干啥)’
‘模式(动作)’
‘pattern(action)’
  • 比较符号:>< <= >= == !=
  • 正则
  • 范围表达式
  • 特殊条件:BEGIN 和 END

比较表达式-参考上面取行部分

正则

  • //支持扩展正则
  • awk 可以精确到某一列,某一列中包含/不包含…内容
  • ~包含
  • !~不包含
正则awk正则
^表示已…开头的行某一列的开头 $3~/^o/root/
$ 表示以…结尾的行某一列的结尾 4 / l i d a o 4~/lidao 4 /lidao/
^$ 表示空行某一列是空的 很少用
awk -F: '$3~/^2/{print $1,$3,$NF}'  /etc/passwd 
awk -F: '$3~/^[12]/{print $1,$2,$3,$NF}' /etc/passwd

表示范围

  • /哪里开始/ /哪里结束/ =常用=

    NR==1,NR==5 从第一行开始到第五行结束 类似于sed -n ’1,5p‘
    #显示指定时间(11:02:00到11:02:03)范围内容的ip地址和用户访问url
    awk '/11:02:11/,/11:02:03/{print $1,$7,$9,$10}' access.log
    

特殊模式BEGIN{} 和END{}

模式含义进行简单统计,计算,不涉及读取文件
BEGIN{}里面的内容会在awk读取文件之前执行进行简单统计,计算,不涉及读取文件(常见)
用来处理文件之前,添加个表头(了解)
用来定义awk变量(很少用,应为可以用-v)
END{}里面的内容会在awk读取文件之后执行awk进行统计,一般过程:先进行计算,最后END里面输出结果(常见)
awk使用数组,哟过来输出组结果(常见)
  • END统计计算
  • 统计方法:i++ i=i+1
统计方法
i++i=i+1计数,统计次数
sum=sum+???sum+=???求和,累加
array[]=array[]++array[]++数组分类计数
注意:i,sum都是变量
#统计/etc/serivces 里面有多少个空行
awk '/^$/{i++}END{print i}'  /etc/services  #17个空行行
seq 100 | awk '{sum=sum+$1}END{print sum}'  #5050
seq 100 | awk '{sum=sum+$1;print sum}END{print sum}'  #5050

awk数组

  • 统计日志:类似于
  • 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次数
  • 累计求和:统计每个ip消耗的流量
shell数组awk数组
形式array[0]=oldboy array[1]=lidaoarray[0]=oldboy array[1]=lidao
使用echo ${array[0]} ${array[1]}print array[0] array[1]
批量输出数组内容for i in ${array[*]}
do
echo $i
done
for(i in array)
print i ,array[i]
awk数组专用循环,变量获取到的是数组的下标,你想要数组内容数组a[i]
awk 'BEGIN{a[0]=oldboy;a[1]=lidao;print a[0],a[1]}'   #字符再awk中会当成变量
awk 'BEGIN{a[0]="oldboy";a[1]="lidao";print a[0],a[1]}' #字符加双引号,数字不用加
awk 'BEGIN{a[0]="oldboy";a[1]="lidao";for(i in a) print a[i] }'
  • 案列
#处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.htmlwww.etiantian.org
post.etiantian.org
mp3.etiantian.org
awk -F"[/.]+"  '{array[$2]++}END{for(i in array)print i,array[i]}' url.txt  #统计分类
www 3
mp3 1
post 2
awk -F"[/.]+"  '{array[$2]++}END{for(i in array)print i,array[i]}'  url.txt | sort -nrk2
www 3
post 2
mp3 1

for循环

for n  in 1 2 3
doecho $n
done
shell 编程c语言for循环awk for 循环
for((i=1;i<=10;i++))
do
echo $i
done
for(i=1;i<=10;i++)
print i
awk for循环用来循环每个字段
#100
awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}'
awk 'BEGIN{for(i=1;i<=100;i++) sum+=i print sum}'
awk 'BEGIN{for(i=1;i<=100;i++) {sum+=i ;print sum}}'

if判断

shell if判断awk if
if[ “age” -eq 18 ];then
echo name
fi
if(条件)
print “test”
if[ “age” -eq 18 ];then
echo name
else
echo “test”
fi
if()
print “test”
else
print “test”
df -h|awk  -F'[ %]+' 'NR>1{if($5>10)print $5}'
13
14
  • 面试题:统计这段语句中,单词中字符数小于6的单词

    echo i am oldboy teacher welcomr to oldboy traning class.|awk -F"[ .]" '{for(i=1;i<=NF;i++) if(length($i)<6)print $i}'
    i
    am
    to
    class

总结

  • gawk gnu awk
  • awk选项-F -v
  • awk执行流程
  • awk取行与取列:指哪打哪
  • awk模式:正则,范围,特殊模式,比较
  • awk数组:统计分析日志
  • awk for if
  • man awk /info awk
  • 目标
    • 计次数
    • ​ access.log 统计每个ip出现次数,统计每种状态码出现次数
    • secure 统计系统中每个用户被攻击的次数,统计攻击者ip出现次数
    • 累加求和:统计每个ip消耗的流量 access.log

http://chatgpt.dhexx.cn/article/kMM8RqBA.shtml

相关文章

linux命令四grep

文章目录 NAME名称SYNOPSIS概要DESCRIPTION描述OPTIONS选项Generic Program Information通用程序信息Matcher Selection匹配器的选择创建测试环境匹配正则测试只匹配字符串(包含特殊字符) Matching Control匹配控制匹配多个正则表达式从文件读取多个匹配样式匹配忽略大小写选择…

C语言基础

01 — Liunx相关命令 1.1 mv:移动&#xff0c;剪切命令 命令格式&#xff1a;mv 源文件 目标文件 作用&#xff1a;剪切成新文件mv 源文件 目标目录下 作用&#xff1a;剪切到制定目录里面去mv 源目录 目标目录 作用&#xff1a;剪切成新目录mv 源目录 目标目录下作用&#…

c语言三个标准流文件格式,标准C语言day02

标准C语言day02 复习&#xff1a; 1、常用的Linux命令 ls、cd、pwd clear touch cp mv rm cat/more/head/tail mkdir rmdir chmod find grep ifconfig ping whoami man sudo ftp telnet ssh tar 2、vim文本编辑器 vi是系统自带的文本编辑器&#xff0c;vim是它的增强版本。 三大…

cf1579

A. Casimir’s String Solitaire 给定一个只存在ABC的字符串&#xff0c;一次操作可以同时删除任意位置的‘A’和‘B’或‘B’和‘C’&#xff0c;问能否删完。 只需判断B的数量是否等于AC的数量。 #include<bits/stdc.h> using namespace std;#define read(a) scanf(&q…

CF 817 C

原题链接&#xff1a; Problem - C - Codeforces 题意&#xff1a; 问从 1 ~ n 有多少个数能使&#xff0c;它减去它的数字和 s。 解法&#xff1a; 可以发现&#xff0c;如果 num 满足条件&#xff0c;那么 num 1 一定也满足条件&#xff0c;所以就有单调性&#xff0c…

CF1837 A-D

A题 题目链接&#xff1a;https://codeforces.com/problemset/problem/1837/A 基本思路&#xff1a; 要求计算蚂蚱到达位置 x最少需要多少次跳跃&#xff0c;并输出蚂蚱的跳跃方案。因为每次可以向左或向右跳跃一定距离&#xff08;距离必须为整数&#xff09;&#xff0c;但是…

npm不是内部命令或外部命令

如上&#xff0c;看到npm -v 或者安装软件时&#xff0c;经常跳出的问题。npm需要加入环境变量中。 如上图片&#xff0c;新建两个文件 node_global\npm&#xff0c;并加入环境变量中。 D:nodejs\node_modules\npm路径下找到.npmrc文件&#xff0c;将其内容改为 prefixD:\node…

启动VUE工程时,出现npm不是内部命令

出现npm不是内部命令&#xff0c;然后查询node -v&#xff0c;也发现node不是内部命令。 所以定位应该是nodejs的问题&#xff0c;因为我的nodejs已经安装了&#xff0c;所以最大的可能就是没有配置环境变量或者配置的不对。 解决步骤&#xff1a; 1.设置环境变量&#xff1…

nvm安装node后npm不是内部命令

nvm install时先下载node&#xff0c;然后下载npm&#xff0c; 下载npm时在node安装目录中会出现temp文件夹&#xff0c;其中有npm压缩包 1、及时将npm压缩包复制出来&#xff0c;不然过会就被删除了 2、解压缩 查看安装目录 使用11.0.0版本 node能够使用&#xff0c;npm不能…

'npm' 不是内部或外部命令,也不是可运行的程序

使用npm命令提示: ‘npm’ 不是内部或外部命令&#xff0c;也不是可运行的程序 在安装nodejs时候&#xff0c;有时候我们会把它安装在d盘或别的盘时&#xff0c;经常会遇到npm环境变量没有配好&#xff0c;需要自己手动去配置。 nodejs在nodejs官网下载后直接点击安装 在安装完…

解决办法‘npm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

今天使用了nvm这个node的保姆级版本管理工具,的确很香。 首先打开官网nvm.uihtm.com/ 下载安装过程很顺利&#xff0c;但是验证node及npm是否安装成功时&#xff0c;出现下面错误提示。 C:\Users\Administrator>npm -v npm 不是内部或外部命令&#xff0c;也不是可运行的…

npm不是内部命令也不是外部可运用程序

在安装好nodejs之后发现每次执行npm命令的时候都会报错&#xff1a;npm不是内部命令也不是外部可运用程序 如下&#xff1a; 百度了很久了没有找到解决办法&#xff0c;最后通过https://blog.csdn.net/qq_41542894/article/details/80330108这篇文章才得以搞定 具体办法就是修…

idea中执行“npm”命令,提示‘node‘ 不是内部或外部命令,也不是可运行的程序

问题描述&#xff1a;idea中执行“npm”命令&#xff0c;提示‘node‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 前提&#xff1a;首先确保自己安装的node.js 环境变量配置成功 解决办法&#xff1a; 重启idea&#xff0c;以管理员身份运行idea&#xff01;&#xf…

nvm安装node后,在使用npm指令时候显示不是内部或外部指令

问题回放 前段时间重装了电脑系统&#xff0c;重新下载了nvm来管理node版本&#xff0c;当时下载的时候可能没有注意&#xff0c;今天用npm的时候就报错npm不是内部或外部指令。 思来想去百度了看看&#xff0c;说是环境变量的问题&#xff0c;我安装nvm的时候改的D盘&#x…

nvm安装node后npm run dev一直报node不是内部或外部命令

nvm安装包下载地址https://github.com/coreybutler/nvm-windows/releases 找到nvm-setup.zip&#xff0c;解压安装即可 如果打不开&#xff0c;也可以在这里下载 链接&#xff1a;https://pan.baidu.com/s/1EvC6oTff1uPD20_RRR9SGQ 提取码&#xff1a;9ztx 安装node nvm inst…

nvm管理node版本 nodenpm不是内部或外部命令,也不是可运行的程序

最近&#xff0c;有新老项目一起开发&#xff0c;node版本太高&#xff0c;老项目起不来&#xff1b;node版本太低&#xff0c;新项目还搭不起来…所以&#xff0c;一个nvm就显得很有必要了。这几个坑掉的&#xff0c;摔的我差点起不来… 废话少说就是&#xff1a; 用管理员身…

解决 npm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

按照网上的方法使用nvm install命令下载&#xff0c;出现 npm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 显示npm安装完成缺报错。环境变量系统自己配好&#xff0c;也没问题。 打开mvn文件夹一看&#xff0c;npm并没有下好&#xff0c;怪不得报错&#xff0c;…

【无标题】cmd命令窗口显示‘npm‘ 不是内部或外部命令

在cmd命令窗口显示上图信息时&#xff0c;大部分是因为nodejs没有装上&#xff0c;如果装上了nodejs&#xff0c;那就是因为没有正确在环境变量里配置路径。配置路径&#xff1a; &#xff08;1&#xff09;新建变量 NODE_PATH D:\Program Files\nodejs; &#xff08;2&#…

使用nvm下载node版本之后,输入npm报错:“npm”不是内部或外部命令,也不是可运行的程序或批处理文件(nvm使用二)

在使用nvm安装node版本成功之后&#xff0c;输入npm发现npm并没有安装成功&#xff0c;在网上查阅资料&#xff0c;发现可能是由于安装的那个node版本是不带npm包的&#xff0c;可以尝试安装一下其他版本的node&#xff0c;我在安装了第二个node版本之后&#xff0c;发现npm已经…

解决“npm不是内部或外部命令“

在使用npm的时候&#xff0c;或者是通过npm下载了一些包&#xff0c;使用这些包的时候&#xff0c;有时候会遇到“npm 不是内部或外部命令”&#xff0c;或者“XXX 不是内部或外部命令”。这种情况一般都是由于安装node.js的时候&#xff0c;环境变量没有配置好。这里把如何配置…