linux—shell中的正则表达式

2023-05-16

一、grep

1、grep概述

文本过滤命令:grep是一种文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行;

grep:由正则表达式或者字符及基本文本字符所编写的过滤条件;

2、grep匹配字符

-E 拓展正则表达式
grep root passwd 查找包含root的关键词

[root@localhost mnt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
redhat:x:0:0:westosroot
grep -E "\<root" passwd      模糊匹配以root开头的词
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
[root@localhost mnt]# grep -E "root\>" passwd   模糊匹配以root字符结尾的关键词
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
redhat:x:0:0:westosroot
[root@localhost mnt]# grep -E "\<root\>" passwd   精确匹配root字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
[root@localhost mnt]# grep -E -i "\<root\>" passwd   忽略大小写匹配root字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
[root@localhost mnt]# grep -E -i "^\<root\>" passwd    忽略大小写匹配root开头额行
root:x:0:0:root:/root:/bin/bash
[root@localhost mnt]# grep -E -i "\<root\>$" passwd    忽略大小写匹配root结尾的行
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
[root@localhost mnt]# grep -E -i "root|ROOT" passwd 模糊过略root或ROOT字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
redhat:x:0:0:westosroot

2、…的使用(贪婪匹配)

grep -E "x.." file	查找file中有x且后面有两个字符的行
grep -E "x..\>" file	查找file中有x且后面只有两个字符的行
grep -E "\<x.." file	查找file中有x开头且后面有两个字符的行
grep -E "\<x..\>" file	查找file中有x开头且后面只有两个字符结尾的行
grep -E "\<..y\>" file	查找file中有两个字符开头且以y结尾的行
grep -E "..y\>" file	查找file中有两个字符在前面且y结尾的行

示例:
这里写图片描述

3、* ? {} , + 等字符的匹配查找

grep -E "x*y" file	查找file中x字符出现任意次后面有y的行
grep -E "x?y" file	查找file中x字符出现0到1次后面有y的行
grep -E "\<x?y" file	查找file中x出现1次开头以y结尾的行
grep -E "\<x{2}y" file	查找file中x出现两次下一个字符是y的行
grep -E "\<x{0,2}y" file查找file中x出现0到2次打头后面有y的行
grep -E "\<x+y" file	查找file中x最少出现1次以上且开头后面有y的行
grep -E "(xy)+" file	查找file中xy出现一次以上的行
grep -E "(xy)+\>" file	查找file中xy出现一次且结尾的行

示例:
这里写图片描述
这里写图片描述

二、sed行编辑器

用来操作ASCII码的文本,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,可以指定仅仅处理那些行。sed符合模式田间的处理,不符合的不处理,处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,不对原文件内容作修改

1、sed命令格式

sed 参数 命令 目标
p模式:显示

sed -n '/\#/p'  fstab 	   显示fstab中包含#的行
sed -n '/UUID/p' fstab	   显示fstab中包含UUID的行
sed -n '/^UUID/p' fstab	   显示fstab中UUID开头的行
sed -n '/UUID$/p' fstab	显示fstab中UUID结尾的行
set -n '5p'	fstab	       显示fstab中的第五行
sed -n '3,5p'	fatab	   显示fstab中的第三到第五行
sed -n '3,5!p'	fatab	  显示除了第三行到第五行的其他行
sed -ne '3p;5p;8p'fstab	   显示fstab中的第三,第五,第八行 -e为多条命令连接
sed -n '/\#/p' -i fstab    显示fstab中的包含#的行,并输入到fstab中

d模式:删除

sed '/^#/d'  fstab	    删除fstab中#开头的行并显示在屏幕
sed '/^UUID/d' fstab	删除fstab中UUID开头的行并显示
sed '/UUID$/d' fstab	 删除fstab中UUID结尾的行并显示
sed '1,4d' fstab	    删除fstab中第1到4行并显示其他行
sed   '/^UUID/!d' fstab	删除除了UUID开头的行并显示

a模式:添加

sed '/UUID$/a hello' fstab	     显示fstab内容并在UUID结尾的行后添加一行hello
sed '/UUID$/a hello\nsed\ntest' 显示fstab内容并在UUID结尾的行后添加一行hello和一行test

这里写图片描述
c模式:替换

sed '/^UUID/c/hello' /mnt/fstab   替换UUID开头的行为hello

这里写图片描述

w模式:插入

sed '/^UUID/w /mnt/hello'  /mnt/fstab	将/mnt/fstab中的UUID开头的行输入到/mnt/hello中

这里写图片描述
sed的其他用法

sed '/^UUID/mnt/fstab='/mnt/fstab	显示UUID开头的行的行数
sed '6r /mnt/hello1' /mnt/fstab 	将fstab中的第六行插入到hello1中
sed '6r /mnt/hello1' /mnt/fstab 	最后一行
sed '1r /mnt/hello1' /mnt/fstab		第一行
sed 'r /mnt/hello1' /mnt/fstab		每一行
sed -n '/^UUID/=' fstab		        显示行数
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab多策略
sed -n -f westos fstab			westos中为策略(/^UUID/p
/^UUID/=)
sed 's/\# *//g' fstab 
sed '/by/,/See/s/\#\ *//g' fstab 
sed 'G' fstab 
sed '$!G' fstab 
sed '=' fstab | sed 'N;s/\n//'
sed '=' fstab | sed 's/\n//'
sed -n '$p' fstab 	显示倒数第一行
sed -n '4p' fstab     显示第四行 
sed '/^UUID/c\hello' fstab 

三、awk

awk -F : '/bash$/{ print $1 }' passwd  列出passwd文件以/bash结尾的行的第一列
awk -F : 'BEGIN{ print "NAME" }{ print $1 } END { print "END" }' passwd 
awk -F : 'NR==3{ print $1 }'  passwd     显示passwd第三行第一列
实现,列出eth0的ip
ifconfig eth0 | awk -F " " '/inet /{print $2}'

这里写图片描述

[root@localhost mnt]# ifconfig eth0 | awk -F " " '/inet /{print $2}'
172.25.254.177
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux—shell中的正则表达式 的相关文章

  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 从配置文件中读取分配

    我有配置文件 其中每行都包含用分号分隔的分配 像这样的东西 模仿正常的 shell 分配 VAR1 1 VAR2 2 VAR1 3 VAR2 4 每行包含相同的变量 并且旨在单独处理 这些配置文件都在系统管理员的控制之下 所以使用eval现
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 带有接收器的 boost_log 示例无法编译

    我正在考虑将 boost log 用于一个项目 一开始我就遇到了以下问题 我在以下位置找到的升压日志示例 http www boost org doc libs 1 54 0 libs log example doc tutorial fi
  • 如何从 swagger 文档生成静态 html 文件?

    我创建了一个 Swagger 文档yaml文件位于 api swagger swagger yaml 现在我想分享一个静态 HTML 文档及其定义 但它已在招摇项目 https github com swagger api swagger
  • 导出多个 LD_LIBRARY_PATH 的正确方法

    对于linux的使用 我是一个新手 根据有关我的项目的指南 我必须多次导出 LD LIBRARY PATH 并且我不确定是否不覆盖它们 Cupti Tensorflow CUDAit export LD LIBRARY PATH LD LI
  • 如何像C99一样使用make和编译?

    我正在尝试使用 Makefile 编译 Linux 内核模块 obj m main o all make C lib modules shell uname r build M PWD modules clean make C lib mo
  • Docker容器内的动态监听端口

    我有一个应用程序 在使用其默认端口建立一些连接后 开始打开 侦听 新的随机端口来处理现有连接 然后删除它们 视频通话 它还在通信协议内交换其IP地址和端口 我能够解决IP地址问题 但仍然无法找到一种方法来动态告诉主机的IPTABLES在Do
  • python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

    Python 的 fcnt 模块提供了一种名为 flock 1 的方法来证明文件锁定 其描述如下 对文件执行锁定操作op 描述符 fd 文件对象提供 fileno 方法被接受为 出色地 请参阅 Unix 手册集群 2 了解详情 在某些系统上
  • bash 脚本中的变量值不会改变[重复]

    这个问题在这里已经有答案了 运行以下代码 a one echo a a two echo a a three echo a gt a 结果是 one one 以及创建的文件名称为 one 内容为 one 为什么变量没有更改为two在第 2
  • 如何在 .zip 文件中使用 grep

    有 3 个文件 a csv b csv c csv 压缩为 abh zip 现在可以在 abh zip 上执行 grep 命令 是否有任何通配符 仅对里面的 c csv 文件运行 grep压缩 如果你有zipgrep 据我所知 它是随zip
  • 如何在变量中存储标准错误

    假设我有一个如下所示的脚本 无用 sh echo This Is Error 1 gt 2 echo This Is Output 我还有另一个 shell 脚本 也无用 sh useless sh sed s Output Useless
  • 如何从C程序执行C程序的shell中更改环境变量?

    我想改变的值PATHC 程序中的变量 然后在运行该程序的 shell 中查看更改后的值 做这样的事情 include
  • 超立方体错误。非法的最小或最大规格

    尝试从这里运行示例代码http tess4j sourceforge net codesample html http tess4j sourceforge net codesample html我收到一条错误消息 Error Illega
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • 终端从包含空格的变量传递参数

    在终端中如何将包含空格的字符串作为参数传递 它实际上跳过了空格后面的部分 只取第一个单词 word soccer ball shell exec casperjs test js word word 那么我怎样才能转义空白它只运行这个命令
  • 使用 unix ksh shell 脚本或 perl 脚本监视文件夹中的新文件并触发 perl 脚本

    我已经在谷歌搜索和溢出了一段时间 但找不到任何可用的东西 我需要一个脚本来监视公共文件夹并在创建新文件时触发 然后将文件移动到私有位置 我有一个 samba 共享文件夹 exam ple 在 UNIX 上映射到X 在窗户上 在某些操作中 t
  • 为什么 ls -l 中的“总计”加起来不等于列出的总文件大小? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么是total在输出中ls l打印为64并不是26078列出的所有文件的总数是多少 ls l test ls total 64 rw
  • 在linux中将包含word的行从一个文件复制到另一个文件

    我想复制包含某些单词的行file1 to file2 Suppose file1 ram 100 ct 50 gopal 200 bc 40 ravi 50 ct 40 krishna 200 ct 100 file2应该只有包含 ct 的

随机推荐