Linux中的awk、sed、grep及正则表达式详解

Linux中的awk、sed、grep及正则表达式详解

简介

awk、sed和grep是Linux中文本操作的三大利器。

其中awk适用于取列,sed适用于取行,grep适用于过滤

正则表达式

首先我们来介绍一下正则表达式,正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式是文本操作的好帮手。

以下是正则表达式的元字符及含义说明。

元字符功能
^匹配行首
$匹配行尾
^$空行
.匹配任意单个字符,包括0次
*匹配多个字符,包括0次
[ ]匹配指定范围内的任意单个字符
[^]匹配不在指定范围内的任意字符
.*匹配任意长度任意字符,不包括0次
..匹配子串
&保存搜索字符用来替换其他字符
\<匹配单词的开始,其后任意字符必须作为单词的首部出现
\>匹配单词的结束,其前任意字符必须作为单词的尾部出现
x\{m\}匹配字符x出现的次数,m次
x\{m,\}匹配字符x出现的次数,至少m次
x\{m,n\}匹配字符x出现的次数,至少m次,不多于n次
?匹配前面的字符1次或0次

有了正则表达式的帮助,我们就可以正式开始来看文本操作三兄弟了。

awk

awk 是对文本进行格式化的工具,适合处理比较复杂的格式处理。有多个版本: 1、new awk: nawk ;2、gawk, awk

awk 命令格式

awk [options] 'script' file1 file2, ...awk [options] 'PATTERN {acticon}' file1 file2, ...

格式说明

  1. pattern部分决定动作语句何时触发及触发事件:BEGIN、END

  2. action 对数据进行处理,放在{}内指明:print、printf

  3. 最常用的是 print,默认以空白字符分隔

    $0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此类推,$NF 代表最后一个字段,多个字段直接用逗号隔开

    awk '{print $1, $2}' xxx.log

    打印操作支持拼接打印,如:awk '{print "first" $1, $2}' xxx.log

  4. options 参数:

参数含义
-F输入分隔符,默认以空白字符进行分隔
-v输出分隔符,默认为空格,使用内置变量OFS来设置输出分隔符

awk内置变量

变量名含义
FS输入字段分隔符,默认空白字符,一般需要加-F
OFS输出字段分隔符,默认是空格,一般需要加-v
NF分隔后的字段数量
NR当前行的行号

实例

有时候我们想要拿到当前目录下的所有文件名,但是如果直接 ls -a | grep "^-"grep "^-" 是过滤只显示文件,下面会详细讲),得到的结果是:

ls -l | grep "^-"
# 输出
-rw-r--r-- 1 root root   487305 May  1 06:45 3d1.txt
-rw-r--r-- 1 root root 10004085 May  1 06:45 3d1_image_urls.txt
-rw-r--r-- 1 root root   167934 May  1 06:45 3d1_singleface.txt
-rw-r--r-- 1 root root  9516780 May  1 06:45 3d1_urls.txt
-rw-r--r-- 1 root root  1289925 May  1 06:45 adzz_3d1_urls.txt

如果我们只想要文件名本身,而不想要其他相关信息数据,该怎么办呢?我们观察到 ls -l 的输出信息是很有规律的,并且就是以空白分隔的,这时我们就可以使用 awk 命令:ls -l | grep "^-" | awk '{print $9}'

从而达到我们想要的效果:

ls -l | grep "^-" | awk '{print $9}'
# 输出
3d1.txt
3d1_image_urls.txt
3d1_singleface.txt
3d1_urls.txt
adzz_3d1_urls.txt

sed

sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

命令格式

sed [options]... 'script' inputfile

参数

参数含义
-n不输出模式空间,即不自动打印
-e多点编辑
-f [PATH_TO_SCRIPT_FILE]从指定文件中读取编辑脚本
-r支持使用扩展正则表达式
-i直接编辑文件
-i.bak备份文件并远处编辑

script 地址定界

  1. 不给地址:对全文进行处理
  2. 单地址:
    • # 指定的行
    • $ 最后一行
    • /pattern/ 被此处模式所能匹配到的每一行

编辑命令

命令说明
d删除模式空间匹配的行,并立即启动下一轮循环
p显示符合条件的行,追加到默认输出之后
a [\]text在指定行后面追加文本,支持使用\n实现多行追加
i [\]text在行前面插入文本
c [\]text替换行为单行或多行文本
w path/file保存模式匹配的行之指定文件
r path/file读取指定的文件的文本至模式空间中匹配的行后
=为模式空间的行打印行号
!模式空间中匹配行去反处理
s///查找替换,支持使用其他分隔符,s@@@,s###

替换标记

  1. g 行内全局替换
  2. p 显示替换成功的行
  3. w path/file 将替换成功的行保存至文件中

例:高效地查看环境变量

sed -i 's/a/v/g' test 将文件中的 a 全部替换为 v ,sed替换格式是:sed -i ‘s/要替换的内容/替换成的内容/g' 文件名

比如说,我们要查看环境变量:

echo $PATH
# 输出
# /home/ps/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

我们知道,这样直接打印的话,输出是按照冒号来进行分隔的,可读性不佳,为了改善这一点,我们可以用sed将冒号替换为换行符:

echo $PATH | sed "s/:/\n/g"
# 输出:
# /home/ps/anaconda3/condabin
# /usr/local/sbin
# /usr/local/bin
# /usr/sbin
# /usr/bin
# /sbin
# /bin
# /usr/games
# /usr/local/games
# /snap/bin

这样可读性就会好很多。

grep

grep 强大的文本搜索工具,根据模式搜索文本,并将符合模式的文本行显示出来。

命令格式:

grep [option] pattern [file]

option 参数

参数含义
-i忽略字符大小写
-n显示匹配的行号
-v显示没有被匹配的行,即反转查找
--color将匹配到的字符以高亮颜色显示出来
-c统计匹配的行数
-o仅显示匹配到的字符串
-q静默模式,不输出任何信息
-w匹配整个单词
-Aafter,显示后行
-Bbefore,显示前行
-Ccontext,显示前后行
-E相当于egrep,即grep -E == grep

这里我们以很常用的查看目录中文件/目录的个数命令为例,分析此例中grep的用法:

这是笔者在网上搜到的查看目录中的文件数:ls -l | grep "^-" | wc -l的命令,我们来看一下他都干了什么。

首先要明确中间的两道 |管道,不了解的读者可以简单地理解为将前一命令的输入直接作为后一命令的输出。

  1. 我们先ls当前目录手动数一下有多少文件。在这里插入图片描述

    蓝色字体的都是目录,白色字体则是一些文本文件。可以看到,当前目录下有3个文件,5个目录。

    再用查到的命令来试一下ls -l | grep "^-" | wc -l在这里插入图片描述

    没有问题,与预期相符。

  2. 第一条命令ls -l,我们来看打印输出了什么在这里插入图片描述

    是各个文件/目录的一些详细信息。我们注意到每一行的第一个字符d或者-分别代表了本行表示的是一个目录,还是一个文件。相必整条命令应该也是借助这一点来判断当前目录下的子目录/文件个数的。

  3. 我们再看第二条命令grep "^-", 果然,我们之前提到过,正则表达式的^就是来匹配第一个字符的,而要查的是文件的个数,自然应该找第一个字符为-的行。那找目录是不是就是应该匹配行首的d呢?我们来试一下:在这里插入图片描述

    果然,与我们数的子目录个数也是符合的。这样我们就知道了怎样来查看当前目录下子目录个数。

    另外,读者可以自己试一试,既然一个目录内不是子目录就是文件,那能不能使用grep的反转查找参数-v来统计子目录数呢?

  4. 第三条命令是 wc -l,我们知道wc命令是用来统计字符数的,而加上-l命令则可以统计行数,可以支持我们grep过滤并通过行数来查看文件数的需求。但是,我们注意到,grep命令本来就自带一个参数-c来统计匹配成功的行数,那是不是可以直接得到文件数呢?我们来试一试ls -l | grep -c "^-"在这里插入图片描述

    可以看到,也是OK的。是一种更简便的写法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android聚焦时如何给控件加边框,edittext设置获得焦点时的边框颜色

第一步&#xff1a;为了更好的比较&#xff0c;准备两个一模一样的EditText(当Activity启动时&#xff0c;焦点会在第一个EditText上&#xff0c;如果你不希望这样只需要写一个高度和宽带为0的EditText即可避免&#xff0c;这里就不这么做了)&#xff0c;代码如下&#xff1a;a…

xargs 命令教程

xargs 命令教程 转自&#xff1a;http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年8月 8日 xargs是 Unix 系统的一个很有用的命令&#xff0c;但是常常被忽视&#xff0c;很多人不了解它的用法。 本文介绍如…

android strictmode有什么作用,Android 性能优化 之 StrictMode

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;StrictMode概述StrictMode 是用来检测程序中违例情况的开发者工具。使用StrictMode&#xff0c;系统检测出主线程违例的情况会做出相应的反应&#xff0c;如日志打…

curl 的用法指南

curl 的用法指南 转自&#xff1a;http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年9月 5日 简介 curl 是常用的命令行工具&#xff0c;用来请求 Web 服务器。它的名字就是客户端&#xff08;client&#xf…

怎么在html显示已登录状态,jQuery Ajax 实现在html页面实时显示用户登录状态

当网站是全静态的html页面时&#xff0c;而又希望网站会员在登录之后并在所有页面头部显示登录状态&#xff0c;如用户名等&#xff0c;如果未登录就是未登录状态&#xff0c;下面给大家来分享实现的方法。一、在html静态页面中加入div&#xff0c;并指定ID如&#xff1a;二、新…

xpwifi热点设置android,教你在XP电脑中开启设置WiFi热点使用的步骤

对于系统中网络的连接问题是最重要的&#xff0c;那在处理不同的错误的情况中&#xff0c;对于无线网络的设置也就是我们说的WiFi的使用也是会遇到问题的&#xff0c;那在操作的时候对于电脑中是怎么实现设置WiFi热点的的&#xff0c;对于这个问题今天小编就来跟大家分享一下教…

C/C++ 指针详解

指针详解 参考视频&#xff1a;https://www.bilibili.com/video/BV1bo4y1Z7xf/&#xff0c;感谢Bilibilifengmuzi2003的搬运翻译及后续勘误&#xff0c;也感谢已故原作者Harsha Suryanarayana的讲解&#xff0c;RIP。 学习完之后&#xff0c;回看找特定的知识点&#xff0c;善…

android双联动列表,Android Fragment实现列表和内容联动

在平板上经常能看到这种的情况&#xff1a;左边是一个列表&#xff0c;右边是列表项对应的内容&#xff0c;当点击某一个列表时&#xff0c;右边内容区也会随之改变。下面使用fragment简单的demo&#xff1a;思路&#xff1a;在mainactivity定义一个回调接口&#xff0c;并在列…

android模拟器太卡,安卓模拟器安装之后太卡怎么解决

用安卓模拟器玩游戏原理就是在电脑上安装了一部手机&#xff0c;如果你的电脑配置不是非常高&#xff0c;能不卡顿吗?遇到卡顿怎么解决?1、安装最新版本的显卡驱动。逍遥模拟器对于显卡的性能要求很高&#xff0c;因此升级至最新版本的显卡驱动&#xff0c;是确保逍遥模拟器流…

编程环境中Runtime(运行时)的三个含义

编程环境中Runtime&#xff08;运行时&#xff09;的三个含义 转自&#xff1a;https://www.zhihu.com/question/20607178 知乎答主doodlewind 三个含义 实际上编程语境中的 runtime 至少有三个含义&#xff0c;分别是&#xff1a; 指「程序运行的时候」&#xff0c;即程序…

非常不错的一款html5【404页面】,不含js脚本可以左右摆动,原生JavaScript实现日历功能代码实例(无引用Jq)...

这篇文章主要介绍了原生JavaScript实现日历功能代码实例(无引用Jq),文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下成品显示&#xff0c;可左右切换月份html 代码移动端日历日一二三四五六css代码*{margin: 0;pa…

计算机应用与基础实践怎么考,自考计算机基础应用科目笔试和实践性考试怎么考...

自考计算机基础应用科目笔试和实践性考试怎么考&#xff1f; 报考自考的考生有些专业的考生会在自己的课程科目中发现计算机基础应用不仅有理论知识考试还有实践性考试&#xff0c;那么自考计算机基础应用科目的笔试和实践性考试怎么考&#xff1f;自考计算机基础应用科目笔试怎…

14 [虚拟化] 虚存抽象;Linux进程的地址空间

14 [虚拟化] 虚存抽象&#xff1b;Linux进程的地址空间 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1N741177F5?p14 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/10.slides#/ 本讲概述 程序 状态机&#xff1b;…

Ubuntu 18.04 安装OpenCV C++

Ubuntu 18.04 安装OpenCV C 构建并安装 仅构建核心模块 # 更新并安装依赖 # 更新并安装依赖 sudo apt update && sudo apt install -y cmake g wget unzip# 下载并解压包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html计算x的y,HTML5画布:旋转时计算x,y点

我开发了一个HTML5 Canvas应用程序&#xff0c;它涉及到读取一个xml文件&#xff0c;该文件描述了需要在画布上绘制的箭头&#xff0c;直形和其他形状的位置。的XML布局的HTML5画布&#xff1a;旋转时计算x&#xff0c;y点实施例&#xff1a;如果对象被旋转它涉及计算一个点的位…

(2021) 20 [虚拟化] 进程调度

(2021) 20 [虚拟化] 进程调度 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p20 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/11.slides#/ 背景 — 机制与策略分离 机制&#xff1a;一个通用的、可定制…

局域网中计算机网络密码查看,Win10怎么查看电脑上已知的wifi网络密码

方法一&#xff1a;网络和共享中心查询1、在Windows 10桌面最左下角的【Windwos开始图标上右键】&#xff0c;在弹出的菜单中点击打开【网络连接】&#xff0c;如下图所示。2、在打开的网络连接设置中&#xff0c;双击已经连接的【无线网络名称】&#xff0c;在弹出的【WLAN状态…

(2021) 22 [持久化] 1-Bit的存储

(2021) 22 [持久化] 1-Bit的存储 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p22 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/12.slides#/ 背景 回顾 操作系统是什么&#xff1f;一组对象 一组API…

(2021) 23 [持久化] I/O设备与驱动

(2021) 23 [持久化] I/O设备与驱动 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p23 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/13.slides#/ 背景 很多人 (你们的同学们、家长们) 都有一个认识&…

(2021) 24 [持久化] 文件系统API

(2021) 24 [持久化] 文件系统API 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p24 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/14.slides#/ 背景 回顾 硬件视角&#xff1a;持久化的“层层抽象” 物…