Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。在说这三个命令前我们要插入一个小插曲就是“正则表达式”。一、正则表达式所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实…

大家好,又见面了,我是你们的朋友全栈君。

    Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。

    我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。

    在说这三个命令前我们要插入一个小插曲就是“正则表达式”。

一、正则表达式

    所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

    三剑客与正则表达式是什么关系呢?

    我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!

    现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。具体如下

元字符                        功能                                                         意思

^                                 匹配行首                                                  表示以某个字符开头

$                                 匹配行尾                                                  表示以某个字符结尾

^$                               空行的意思                                              表示空行的意思

 .                                 匹配任意单个字符                                   表示任意一个字符

*                                 字符*   匹配0或多个此字符                     表示重复的任意多个字

\                                  屏蔽一个元字符的特殊含义                   表示去掉有意义的元字符的含义

[]                                 匹配中括号内的字符                              表示过滤括号内的字符

.*                                代表任意多个字符                                   就是代表任意多个字符

lele\{n\}                       用来匹配前面lele出现次数。n为次数       就是统计前面lele出现的次数

lele\{n,\}                      含义同上,但次数最少为n                 

lele\{n,m\}                   lele出现次数在n与m之间

三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

二、grep

1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:

–color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式

测试:

grep     匹配条件   处理文件

grep root passwd ##贪婪匹配

grep ^root passwd ##以root开头

grep bash$ passwd ##以bash结尾

grep -i root passwd ##忽略大小写

grep -E “root|ROOT” passwd ##后面条件可以是一个正则表达式  
 

Linux三剑客 grep sed awk 详细使用方法

cat -b passwd | grep mail ##默认显示mail所在行

cat -b passwd | grep mail -2 ##查看mail及上下两行

cat -b passwd | grep mail -A2 ##查看mail及下两行

cat -b passwd | grep mail -B2 ##查看mail及上两行

Linux三剑客 grep sed awk 详细使用方法

'ws'
'w...s'	
'w.....'	
'.....s'

Linux三剑客 grep sed awk 详细使用方法

三、sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

1.sed命令格式

sed [option]... 'script' inputfile

(1)选项

    -n 不输出模式空间内容到屏幕,即不自动打印
    -e 多点编辑
    -f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
    -r 支持使用扩展正则表达式
    -i 直接编辑文件
    -i.bak 备份文件并原处编辑

(2)script 地址定界

    不给地址:对全文进行处理
    单地址:
    #: 指定的行,$:最后一行
    /pattern/:被此处模式所能够匹配到的每一行
    地址范围:
    #,#
    #,+#
    /pat1/,/pat2/
    `#,/pat1/
    ~:步进
    1~2 奇数行
    2~2 偶数行

(3)编辑命令:

    d 删除模式空间匹配的行,并立即启用下一轮循环
    p 打印当前模式空间内容,追加到默认输出之后
    a [\]text1 在指定行后面追加文本,支持使用\n实现多行追加
    i [\]text 在行前面插入文本
    c [\]text 替换行为单行或多行文本
    w /path/somefile 保存模式匹配的行至指定文件
    r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
    = 为模式空间中的行打印行号
    ! 模式空间中匹配行取反处理
    s///:查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
        g 行内全局替换
        p 显示替换成功的行
        w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中

(1)p模式操作

cat fstab -n | sed 5p			##编辑第五行,并在屏幕中显示
cat fstab -n | sed -n 4p 		##只显示第五行
cat fstab -n | sed -n 3,6p		##显示3-5行内容
cat fstab -n | sed -n '3p;6p' 	##显示第三行和第五行

Linux三剑客 grep sed awk 详细使用方法

sed -n '/#/p' fstab		##显示#所在行
sed -n '/#/!p' fstab		##显示不带#的行
sed -n '/\:/p' fstab		##显示含:的行
sed -n '^UUID/p' fstab		##显示以UUID开头的行
sed -n '/^$/!p' fstab		##不显示空白行
sed -n '/^$/!p' fstab | sed -n '/^#/!p'	##不显示空白行和#所在行

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

(2)d模式操作

sed '/^UUID/d' fstab		##删除UUID所在行
sed '/^UUID/!d' fstab		##出UUID行,其他都删除
sed '/^#/d' fstab		##删除所有含#的行
sed '/^$/d' fstab		##删除空格行
cat -n fstab | sed '5d'		##删除第五行
cat -n fstab | sed '2d;5d'	##删除第二行和第五行
cat -n fstab | sed '2,5d'	##删除2-5行

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

(3)a模式操作

sed '/^UUID/ahello' fstab			##在UUID下一行添加
sed '/^UUID/ahello\nvan' fstab	                ##在UUID下一行添加两行
sed '4ahello\nvan' fstab			##在第四行的下一行添加
sed '4ihello\nvan' fstab			##在第四行插入

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

(4)c模式操作

sed '/#/chello' fstab			##将所有含#的行改为hello
sed '/^#/cwestos' -i fstab		##将所有含#的行给为westo并保存修改

Linux三剑客 grep sed awk 详细使用方法

练习:编写一个脚本,用来改写apache配置文件中的端口号

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

(5)w模式操作

sed '/^UUID/w file' fstab		##将UUID所在行,导入file文件,该文件可以不存在

 Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

(6).sed的其他用法

6.1统计文件行数

sed -n ‘/^UUID/=’ fstab      ##统计文件的行数
sed ‘/^UUID/=’ fstab         ##将行数放到UUID所处位置
sed -n ‘$=’ fstab            ##统计行数
wc -l fstab | cut -d ” ” -f 1
 Linux三剑客 grep sed awk 详细使用方法

6.2插入内容

sed ‘6r /opt/insert’ fstab                      ##将/mnt/file文件的内容放到fstab文件的第六行后
sed ‘$r /opt/insert’ fstab                      ##将/mnt/file文件的内容放到fstab文件的最后
sed ‘$r /opt/insert’ fstab -i fstab          ##保存对该文件的修改,该文件必须存在,不存在则不能使用该命令
sed ‘$r/opt/insert’ fstab > test             ##    保存修改到test文件中
Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

6.3处理规则设定

sed -f rule fstab		根据文件中的规则对文件进行处理
vim rule
/^UUID/p
/UUID/=

 Linux三剑客 grep sed awk 详细使用方法

6.4替换文件内容

sed ‘s/sbin/#########/g’ passwd        ##将文件所有sbin替换成########
sed ‘1,5s/sbin/#########/g’ passwd    ##将文件前五行中的sbin替换成########
sed ‘/adm/,/halt/s/sbin/********/g’ passwd    ##将adm到halt行中的sbin替换成*******
sed ‘s/\///g’ passwd            ##将passwd文件中的所有/删除
Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

6.5 @与/等同

sed ‘s@/@#####@g’ passwd        ##将passwd文件中的所有/替换成#####,其中@也是/
sed ‘s@sbin@####@g;s/nologin/*******/g’ passwd
sed -e ‘s@sbin@####@g’ -e ‘s/nologin/!!!!!/g’ passwd
Linux三剑客 grep sed awk 详细使用方法

 6.6其他命令

sed 'G' fstab		##在每一行后面添加一个空白行
sed '$!G' fstab
sed '=' fstab		##在每一行前添加行号
sed '=' fstab | sed 'N;s/\n//'	##进行预处理

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

Linux三剑客 grep sed awk 详细使用方法

四 AWK

AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

命令基本格式:

awk [optioins] {program} file

 

简化命令 选项 描述
-F fs 指定行中划分数据字段的字段分隔符 「* 超高频」
-f file 从指定的文件中读取程序
-v var=value 定义awk程序中的一个变量及其默认值
-mf N 指定要处理的数据文件中的最大字段数
-mr N 指定数据文件中的最大数据行数
-W keyword 指定awk的兼容模式或者警告登记

$0 :代表整个文本行

$1:代表文本行中的第一个数据字段(第一列)

$2:代表文本行中的第二个数据字段(第二列)

$n:代表文本行中的第二个数据字段(第n列)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157392.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 外汇平台的搭建方法及注意事项有哪些_外汇平台搭建员工怎么判刑

    外汇平台的搭建方法及注意事项有哪些_外汇平台搭建员工怎么判刑摘要:从业外汇几年,都会听到外汇平台搭建,都知道外汇是个零和市场,赚少亏多,搭建外汇平台又可以做市商,且国家监管又很宽松,都想跃跃欲试,但是自己又不懂,不知道具体流程,又不知道需要多少资金,又没有认识的“人才”,又担心上当受骗,自然就会徘徊再做与不做之间。本文详…从业外汇几年,都会听到外汇平台搭建,都知道外汇是个零和市场,赚少亏多,搭建外汇平台又可以做市商,且国家监管又很宽松,都想跃跃欲试,但是…

    2022年9月11日
    0
  • 多重共线性:python计算VIF以及使用vif做因子独立性检验的方法「建议收藏」

    多重共线性:python计算VIF以及使用vif做因子独立性检验的方法「建议收藏」转自:https://blog.csdn.net/ab1112221212/article/details/100133066多重共线性在python中的解决方法本文将讨论多重共线性的相关概念及利用python自动化消除多重共线性的方法,以供参考,欢迎拍砖线性模型与非线性模型关于线性模型与非线性模型的定义,似乎并没有确切的定论,但是个人认为建模首先得清楚地认识样本,样本有线性可分与线性不可分两种,所谓是否线性可分,是指是否存在一条直线(或平面)将样本分开。上图中y=0和y=1的样本可以由一

    2022年6月5日
    202
  • 学生信息管理系统登录入口_学生信息管理系统Java sql

    学生信息管理系统登录入口_学生信息管理系统Java sqlphp大作页,使用php+mysql技术,实现了基本的分页,信息查询,修改,增加,删除操作有以下几个基本页面登录页面首页修改学生基本信息修改学生学籍信息修改学生成绩信息增加学生信息源码在我的github上,欢迎大家访问https://gitee.com/zxhjames/zxh/tree/master/StudentInformationManageSystem…………………

    2022年10月2日
    0
  • spring中aop实现原理_Spring底层原理

    spring中aop实现原理_Spring底层原理写在前面:对于一个java程序员来说,相信绝大多数都有这样的面试经历,面试官问:你知道什么是aop吗?谈谈你是怎么理解aop的?等等诸如此类关于aop的问题。当然对于一些小白可能会一脸懵逼;对于一些工作一两年的,可能知道,哦!aop就是面向切面变成,打印日志啊,什么什么的,要是有点学习深度的呢可能会说aop底层实现利用了jdk动态代理,cglib啊什么的。很多时候可能面试就到此打住了,当然,然后也…

    2022年8月11日
    3
  • jmeter并发不同请求_jmeter3000个并发怎么测

    jmeter并发不同请求_jmeter3000个并发怎么测Jmeter压力测试工具直接上图查询重复数据如下:selectcount(order_id),order_id,report_typefromt_mapping_order_reportgroupbyorder_id,report_typehavingcount(order_id)>1解决方案:在两个列上添加唯…

    2022年9月27日
    0
  • 向量与矩阵范数_矩阵范数与谱半径的关系

    向量与矩阵范数_矩阵范数与谱半径的关系范数(norm),是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,范函是一个函数,其为矢量空间内的所有矢量赋予非零的正长度或大小。半范数反而可以为非零的矢量赋予零长度。举一个简单的例子,在二维的欧氏几何空间R就可定义欧氏范数。在这个矢量空间中的元素常常在笛卡儿坐标系统中被画成一个从原点出发的带有箭头的有向线段。每一个矢量的欧氏范数就是有向线段的长度。其中定义范数的矢量空间就是赋范矢

    2022年9月19日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号