点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达
今日推荐:Spring Boot + Vue 如此强大?竟然可以开发基于 C/S 架构的应用个人原创+1博客:点击前往,查看更多

介绍

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.txta
b
c
d
py*
i love python

-v 选项

grep -v a show.txtb
c
d
*py
i 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.txtpy*

了解的选项

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

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

grep -w love show.txtlove
i love
i love a

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

grep -x "i love a" show.txti 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.txt1
2
3
4
5
6
7

查找4及其上下2行

cat show.txt | grep -C 2 42
3
4
5
6

查找4及其前2行

grep -B 2 4 show.txt 2
3
4

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/passwdroot:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出文件的每行内容

# $0为整行内容
awk '{print $0}' /etc/passwdroot:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出第二列内容

需要指定分隔符:

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

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

cat show.txt# 空格分隔
python java php
# tab键分隔
flink hadoop storm

输出第一列内容

awk '{print $1}' show.txtpython
flink

输出每一行有多少列

awk '{print NF}' show.txt3
3

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

awk '{print $NF}' show.txt

输出行号

awk '{print NR}' show.txt1
2

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

awk '{print FNR}' show.txt /etc/passwd1
2
1
2
...

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

cat show.txtpython|java|php--flink|hadoop|storm

先输出每一行数据

# RS为指定行分隔符
awk 'BEGIN{RS="--"}{print $0}' show.txtpython|java|php
flink|hadoop|storm

输出每一行的第二列

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

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

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

再次指定列分隔符

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

输出文件名字

cat show.txtpython|java|php
flink|hadoop|storm
awk '{print FILENAME}' show.txtshow.txt
show.txt

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

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

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

2020-05-21 request enter
2020-05-21 request ip 127.0.0.1
2020-05-21 request finish
2020-05-21 request enter
2020-05-21 request error
2020-05-21 request enter
2020-05-21 request ip 127.0.0.1
2020-05-21 request finish
2020-05-21 request enter
2020-05-21 request ip 11.25.58.21
2020-05-21 request finish

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

# sort为排序,uniq为去重
cat request.log | grep ip | awk '{print $4}' | sort | uniq
11.25.58.21
127.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 sed
this is second line# 将second替换为first输出到屏幕,文件内容并没有改变
# 有选项可以指定,不再介绍
sed 's/second/first/' show.txt
this is a test for sed
this is first line
最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了大厂offer,拿去不谢!下载方式1. 首先扫描下方二维码
2. 后台回复「Java面试」即可获取

五分钟入门文本处理三剑客grep awk sed相关推荐

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

    介绍 grep awk sed是Linux下文本处理常用的命令,能完成很多神奇的操作,今天就分享一下这三个命令最常见的用法 grep 使用一般有如下两种形式 第一种形式 grep [option] [ ...

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

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

  3. 利器 | 测试必会之 Linux 三剑客 ( grep / awk / sed )

    本文为霍格沃兹测试学院优秀学员课程学习系列笔记,想一起系统进阶的同学文末加群交流. Linux 给人的印象是黑乎乎的神秘窗口,文本操作和数据处理似乎没有 Windows 窗口界面直观方便.其实Linu ...

  4. Linux文本三剑客(grep、sed、awk)

    目录 grep 1.什么是grep和rgrep? 2.使用grep 2.1.命令格式 2.2.命令功能 2.3.命令参数 3.实战演示 sed 1.认识sed 2.使用sed 2.1.命令格式 2.2 ...

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

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

  6. STM32F103五分钟入门系列(十三)独立看门狗IWDG

    参考:STM32F103五分钟入门系列(十三)独立看门狗IWDG 作者:自信且爱笑' 发布时间:2021-07-31 19:50:28 网址:https://blog.csdn.net/Curnane ...

  7. STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

    摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...

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

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

  9. Maven五分钟入门

    Maven 五分钟入门 ---本文翻译自Maven官网的Maven in 5 Minutes,稍有删改,所有版权归maven所有.本文只作学习交流之用. 安装 Maven 是一个java工具,因此,在 ...

最新文章

  1. centos6 mysql 导出sql_centos环境下如何导出数据库
  2. 并发译文翻译计划(二)
  3. 想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能
  4. python爬虫系列(3.8-正则的使用)
  5. vue怎么通过if跳出方法_vue多种弹框的弹出形式
  6. Preparedstatement和statement 区别
  7. 语言木头折断放置问题_木头文化:干燥,是木成材的关键一步
  8. python的整数类型_Python 标准数据类型:Bytes
  9. 2021最新 武汉互联网公司
  10. win7鼠标指针主题包_MouseInc 小巧好用的鼠标手势软件
  11. JavaScript设计模式之职责链模式
  12. Oracle sql语句 待新增(新增字段)
  13. 解答腾讯会议的常见新手问题
  14. java数据库连接Druidsql失败_Druid数据库连接池异常connection holder is null
  15. LINODE优惠码与服务器搭建
  16. 程序员们,再不行动就来不及了!
  17. [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络
  18. 婚恋职场人格-张晓文-武汉理工大学-中国MOOC-人格知识大比武测试题参考答案
  19. 关于execel单元格中的数字变成文本(左上角带绿色三角形标志)的办法
  20. 4.UWB代码讲解注释

热门文章

  1. jQuery如何实现表单的自动提示
  2. dblclick,默认全选屏蔽
  3. 定点c程序之一:定标
  4. [导入]Vista的translator.gadget(117.64 KB)
  5. Ubuntu根目录文件作用分析
  6. 关于STM32使用RTC时复位后程序死在 RTC
  7. 下载linux操作系统一般的初始账号密码(虚拟机)
  8. IDA无法反编译 and 提示错误
  9. 06-Firmware Configuration Framework
  10. optee内核中栈的介绍(二)