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中的正则表达式 的相关文章

  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 检查帐号是否为数字时出现语法错误

    if account nr 0 9 from account nr 0 9 这是为了检查帐号是否为数字 我收到语法错误 这个问题的早期版本缺少之间的空格if and 实际代码具有所需的空间 它显示以下错误消息 syntax error ac
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc

随机推荐