介绍

grep awk sed是Linux下文本处理常用的命令,能完成很多神奇的操作,今天就分享一下这三个命令最常见的用法

grep

使用一般有如下两种形式

第一种形式

grep [option] [pattern] [file1,file2]

如查找show.txt里面包含content的行

grep content show.txt

第二种形式

command | grep [option] [pattern]

如查看某个服务信息

ps -ef | grep mongo

如查找show.txt里面包含content的行

cat show.txt | grep content

必须掌握的选项

选项 含义
-v 显示不匹配行信息(反向搜索)
-i 搜索时忽略大小写
-n 显示行号(文件中的行号)
-r 递归搜索(搜索文件夹)
-E 支持扩展正则表达式
-F 不按正则表达式匹配,按照字符串字面意思匹配
cat show.txt

abcdpy*i love python

-v 选项

grep -v a show.txt

bcd*pyi love python

-n选项

grep -n a show.txt 

1:a

-r选项 查找/etc/myconfig及其子目录下,打印出包含content字符串所在行的内容

 grep -r content /etc/myconfig

-F选项

grep py* show.txt 

py*i love python

py被当成正则表达式处理,我就想搜索py这个内容,就可以用到-F选项

grep -F py* show.txt

py*

了解的选项

选项 含义
-c 只输出匹配行的数量,不显示具体内容
-w 匹配整词
-x 匹配整行
-l 只列出匹配的文件名,不显示具体匹配行内容
cat show.txt

love lovelovei lovei love a

-w选项(lovelove这个词没有显示出来,因为love前后得有空格或者tab才会认为是一个单词)

grep -w love show.txt

love i lovei love a

-x 选项(匹配行,行的内容只能是i love a)

grep -x "i love a" show.txt

i love a

这些选项可以混着用,例如

查找/etc/myconfig及其子目录下,打印出包含content字符串所在文件的文件名

grep -rl abc /etc/myconfig

-r:递归搜索(搜索文件夹) -l:只列出匹配的文件名,不显示具体匹配行内容

当然用find也是可以的,只不过麻烦一点

find /etc/myconfig -type f | xargs grep -l abc 

这个命令在看配置的是时候还是挺管用的

查看日志常用的选项

选项 含义
-C n 显示匹配行及其前后5行
-B n 显示匹配行及其前5行
-A n 显示匹配行及其后5行
cat show.txt

1234567

查找4及其上下2行

cat show.txt | grep -C 2 4

23456

查找4及其前2行

grep -B 2 4 show.txt 

234

grep和egrep的区别和联系

grep默认不支持扩展正则表达式,只支持基础正则表达式 使用grep -E 可以支持扩展正则表达式 使用egrep可以支持扩展正则表达式,与grep -E等价

awk

使用一般有如下两种形式

第一种形式

awk 'BEGIN{}pattern{commands}END{}' file_name
语法格式 解释
BEGIN 正式处理数据之前
pattern 匹配模式
{commands} 匹配命令,可能多行
END 处理完所有匹配数据后执行

第二种形式

standard output |  awk 'BEGIN{}pattern{commands}END{}'

awk的内置变量

内置变量 含义
$0 整行内容
n 当前行的第1-n个字段(按照指定分隔符分割后)
NF(Number Field) 当前行的字段个数,也就是多少列
NR(Number Row) 当前行的行号,从1开始计数
FNR(File Number Row) 多文件处理时,每个文件行号单独计数,都是从0开始
FS(Field Separator) 输入字段分割符。不指定默认以空格或者Tab键分割
RS(Row Separator) 输入行分割符。默认回车\n
OFS(Output Field Sepatator) 输出字段分割符。默认为空格
ORS(Output Row) 输出行分隔符。默认为回车
FILENAME 当前输入的文件名字
ARGC 命令行参数个数
ARGV 命令行参数数组

看一下/etc/passwd文件的内容

cat /etc/passwd

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

输出文件的每行内容

# $0为整行内容awk '{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

输出第二列内容

需要指定分隔符:

# $2为第二列内容awk 'BEGIN{FS=":"}{print $2}' /etc/passwd

xxx

不需要指定分割符,默认空格,tab键,多个也可以分隔(如一个空格+一个tab键)

cat show.txt

# 空格分隔python java php# tab键分隔flink hadoop storm

输出第一列内容

awk '{print $1}' show.txt

pythonflink

输出每一行有多少列

awk '{print NF}' show.txt

33

可以用这个输出每一行的最后一列的值

awk '{print $NF}' show.txt

输出行号

awk '{print NR}' show.txt

12

对每个文件的行号单独计数(显示show.txt和/etc/passwd文件的行号,不累加)

awk '{print FNR}' show.txt /etc/passwd

1212...

同时指定行分隔符和列分隔符

cat show.txt

python|java|php--flink|hadoop|storm

先输出每一行数据

# RS为指定行分隔符awk 'BEGIN{RS="--"}{print $0}' show.txt

python|java|phpflink|hadoop|storm

输出每一行的第二列

# RS指定行分隔符# FS指定列分隔符awk 'BEGIN{RS="--";FS="|"}{print $2}' show.txt

javahadoop

在上面基础上指定行分隔符

# ORS 输出行分割符awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $2}' show.txt

java&hadoop&

再次指定列分隔符

# OFS输出列分隔符awk 'BEGIN{RS="--";FS="|";ORS="&";OFS="@@"}{print $1,$2}' show.txt

python@@java&flink@@hadoop&

输出文件名字

cat show.txt

python|java|phpflink|hadoop|storm
awk '{print FILENAME}' show.txt

show.txtshow.txt

因为是对行进行处理,所以有几行,输出几次文件名

当然awk还有其他强大的操作,如支持函数,流程控制,格式化输出等。有兴趣的可以了解一下awk编程,这里就不再多做介绍了

假如有一个如下的访问日志request.log

2020-05-21 request enter2020-05-21 request ip 127.0.0.12020-05-21 request finish2020-05-21 request enter2020-05-21 request error2020-05-21 request enter2020-05-21 request ip 127.0.0.12020-05-21 request finish2020-05-21 request enter2020-05-21 request ip 11.25.58.212020-05-21 request finish

想统计当日去重后的ip有多少个,就可执行如下命令

# sort为排序,uniq为去重cat request.log | grep ip | awk '{print $4}' | sort | uniq11.25.58.21127.0.0.1

我原来维护了一个hadoop集群,当想关闭集群中的所有DataNode节点(可以认为一个应用),假如每个机器jps,查看pid,kill。很麻烦,直接写了一个脚本,依次ssh到各个节点,然后执行如下命令即可,超级省事

kill `jps | grep 'DataNode' | awk '{print $1}'`

sed

sed的功能和文本编辑器有点类似,因为我在Linux对文本进行修改用vim比较多,sed的话可能在脚本中用的多一点,因此也没多少经验,简单介绍一个替换的示例

cat show.txt this is a test for sedthis is second line

# 将second替换为first输出到屏幕,文件内容并没有改变# 有选项可以指定,不再介绍sed 's/second/first/' show.txtthis is a test for sedthis is first line

awk处理带有空格的字符串_五分钟入门文本处理三剑客grep awk sed相关推荐

  1. 五分钟入门文本处理三剑客grep awk sed

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Spring Boot + Vue 如此强大?竟然可以开发基于 C/S 架构的应用个人原创+1博客:点击前往,查 ...

  2. awk 内嵌正则 提取字符串_干货-Shell编程文本处理三剑客之-awk

    awk 在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂 ...

  3. c++怎么输入带有空格的字符串_杭电OJ 字符串处理类部分题解

    一.前言 不知不觉已经大三上学期了,可作为一个计算机狗还没有考过CCF-CSP.因平时学习内容主要与安全方面相关,对于此类算法类的考核并没有太多的准备,故打算开始刷题复习算法和数据结构,准备CCF认证 ...

  4. 28.文本处理三剑客grep,sed,awk

    三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换,awk擅长取列. 目录 一.grep 二.sed sed选项 sed内置常用命令字符 sed匹 ...

  5. c++怎么输入带有空格的字符串_字符串,啥东东?

    朋友学了若干天C++后-- 首先,先来看看char,他是字符类型的.假设创建a的字符.便char a; 它可以创建名为a的字符储存,注意,是字符,不是字符串. 意味着,只能将a='a';,等于一个字符 ...

  6. markdown 本地链接_五分钟快速入门Markdown

    前言 开篇第一问,什么是markdown?我为什么选择用它而不是用word? markdown是一种极为简洁的标记语言,使用markdown可以更集中于写作内容本身而不必过分纠结于格式排版问题,可以把 ...

  7. shell浅谈之七文本处理工具grep、sed、awk

    一.简介 Bash Shell提供了功能强大的文件处理工具:sed(流编辑器stream editor)和awk,都可使用正则表达式进行模式匹配.而grep又有助于理解sed和awk. 二.grep命 ...

  8. Linux文本三剑客--grep、sed、awk

    Linux文本三剑客–grep.sed.awk 文章目录 Linux文本三剑客--grep.sed.awk 1.grep 1.1什么是grep 1.2使用grep 命令格式 命令参数 基本正则表表达式 ...

  9. STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

    摘自:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 作者:自信且爱笑' 发布时间: 2021-04-28 21:17:40 网址:https://blog. ...

最新文章

  1. TCP粘包问题 转自CSDN
  2. 反汇编引擎diStorm3
  3. Qt 互斥锁 QMutex 的简单应用
  4. 解密NTFS下经EFS加密的文件
  5. 10+知识图谱开放下载,让你的学习效率提升5倍! | “右脑”开发套餐
  6. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732E电磁流量计对环境和温度的限制
  7. 低配,比又穷又忙更可怕
  8. 荣耀9X将搭载麒麟810处理器:全球四大7nm芯片之一无法低调
  9. 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象...
  10. android自动完成输入框,Android——自动完成输入框提示功能的菜单_AutoCompleteTextView...
  11. 计算机录像怎么操作,电脑屏幕录制怎么操作?
  12. codeforces920 C. Swap Adjacent Elements【连通块 + 前缀和】
  13. C语言中%d,%o,%f,%e,%x的意义
  14. Spring中常用注解及其作用(二)
  15. 软文标题怎么写吸引人?记住这几个套路
  16. NEO智能合约开发(二)再续不可能的任务
  17. Spring Boot Admin 发送监控邮件
  18. 王菲给师父打电话拜年,受高人指点,她扶摇直上联手天王横扫歌坛
  19. md4 java_求MD4 java实现的代码
  20. 人工智能门槛太高?用这个框架轻松入门深度学习!

热门文章

  1. 创业期的软件开发管理(二)
  2. day17 appium环境搭建
  3. MyEclipse 2017 CI 10 发布(附下载)
  4. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  5. NDoc修改手记(一)
  6. VS各种工程文件说明
  7. waring Release版本
  8. 关于C++中的 多态 问题
  9. Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001
  10. 持续集成部署Jenkins工作笔记0008---创建用于测试的Maven工程