Linux_note 命令grep,sed,awk

2023-05-16

1、grep 过滤出指定的行

grep  [-cinvABC]  'word'  filename

--color 把匹配到的关键词用红色标识 如:# grep --color 'root' /etc/passwd


-c :打印符合要求的行数


-i :忽略大小写


-n :在输出符合要求的行的同时连同行号一起输出


-v :打印不符合要求的行# cg -v 'root' 1.txt


-A :后跟一个数字(有无空格都可以),例如 朅2则表示打印符合要求的行以及下面两行

# cg -A 2 -n 'root' 1.txt

-B :后跟一个数字,例如 B 2 则表示打印符合要求的行以及上面两行# cg -B 2 -n 'root' 1.txt


-C :后跟一个数字,例如 C 2 则表示打印符合要求的行以及上下各两行# cg -C 2 -n 'root' 1.txt

-r :将目录下所有文件全部遍历 # cg -r 'iptables' /etc/*  或# cg -rh 'iptables' /etc/*

[root@zekLinux ~]# alias cg='grep --color'

[root@zekLinux ~]# cg -n 'root' 1.txt

1:root:x:0:0:root:/root:/bin/bash

11:operator:x:11:0:operator:/root:/sbin/nologin

[root@zekLinux ~]# cg -c 'root' 1.txt

2

[root@zekLinux ~]# cg -A 2 -n 'root' 1.txt

1:root:x:0:0:root:/root:/bin/bash

 grep sed 都是支持 {1,3}这样的匹配规则的,表示重复前面字符1到3次。但是awk属于一个比较复杂的脚本语


言,在它里面()和{}都是有特殊含义的,所以我们要使用这些符号时,需要给他们脱义,你可能会想到使用\脱


义,但是不管用。有一个方法就是加上--posix选项就ok ,比如

awk --posix -F ':' '$1 ~ /(ab)+|o{1,3}/' 1.txt

这样就可以把B选项匹配出来

2-bin:x:1:1:bin:/bin:/sbin/nologin

3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

--

11:operator:x:11:0:operator:/root:/sbin/nologin

12-games:x:12:100:games:/usr/games:/sbin/nologin

13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

[root@zekLinux ~]# cg -B 2 -n 'games' 1.txt

10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

11-operator:x:11:0:operator:/root:/sbin/nologin

12:games:x:12:100:games:/usr/games:/sbin/nologinli


例子:

过滤出带有某个关键词的行并输出行号

# cg -n 'aming' 1.txt 或者grep -n --color 'aming' 1.txt   cg= 'grep --color '

过滤出带有某个关键词的行并输出行号

# cg -v -n  'nologin' 1.txt

过滤出所有包含数字的行

#cg -n '[0-9]' 1.txt

过滤出包含某个字母的行并输出行号

# cg -n '[aN]' 1.txt

#cg -n -i '[aN]' 1.txt

过滤出不包含字母的行并输出行号

[root@zekLinux ~]# grep --color  -n -v '[a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%

23:

33:34988385983402474023572647346348324623768329

去除以字母开头的行

[root@zekLinux ~]# cg -n -v '^[a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%

23:

33:34988385983402474023572647346348324623768329

过滤出不以数字开头的行

#cg -n '^[^0-9]' 1.txt

匹配出不包含数字的行

#cg -n '[^0-9]' 1.txt

去除空行

[root@zekLinux ~]# grep -v '^$' 1.txt

过滤任意一个或多个字符

#cg 'r.o' 1.txt

# cg 'r*o' 1.txt

#cg 'r*o' 1.txt 匹配出r开头o结尾的字符,中间是什么不重要,也叫贪婪匹配。

 . 表示任意一个字符

 * 表示零个或多个前面的字符

.* 表示零个或多个任意字符,空行也包含在内

grep 'r\?o' passwd 表示匹配零个或一个前面为“r”的字符。

grep 'r.*o' passwd 表示r开头o结尾,中间零个或多个任意字符

grep 'r*o' passwd 匹配匹配零个或多个前面的字符。这个前面的字符是“r”,可以是0个r或者多个r

grep '^[1-9][0-9]*$' 1.txt:匹配开头为1到9其中一个数字,结尾是0个或多个数字


过滤出以特殊符号开头的行

[root@zekLinux ~]# cg -n '^[^0-9a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%


egrep ==grep -E egrep时grep的扩展形式 egrep能用的grep全都能用

grep --color  'r\?o' 1.txt==grep --color -E 'r?o' 1.txt==egrep --color 'r?o' 1.txt

匹配1个和1个以上+前面的字符

# egrep --color 'r+o' 1.txt

总结:. 任意一个字符;* 零个或多个*前面的字符; .* 任意个任意字符; ? 0或1个?前面的字符;+ 1或多


个+前面的字符。

匹配root或nologin

#egrep --color 'root|nologin' 1.txt

匹配root和nologin

# grep --color 'root' 1.txt |grep --color 'nologin'

用括号表示一个整体

#egrep --color '(rr)' 1.txt

匹配1个或多个rr

#egrep --color '(rr)+' 1.txt

指定匹配字符次数范围

# egrep --color '(rr){1,3} 1.txt

? + () {} | 符号要用egrep。


2、sed

打印指定的行

# sed -n '10'p 1.txt

打印指定范围,如20行到末

# sed -n '20,$'p 1.txt

打印包含某个字符串的行

# sed -n '/root/'p 1.txt

可以使用^ . * $ + ? 等特殊符号

# sed -n '/r.o/'p 1.txt

# sed -n '/r*o/'p 1.txt

# sed -n '/r.*o/'p 1.txt

# sed -n '/r\?o/'p 1.txt

# sed -n '/r\+o/'p 1.txt

# sed -n '/root\|nologin/'p 1.txt

# sed -n '/\(oo\)\+/'p 1.txt

-r不需要脱意符号

# sed -n -r '/(oo)+/'p 1.txt

# sed -n -r '/[^0-9]/'p 1.txt

# sed -n -r '/[^a-zA-Z]/'p 1.txt

空行

# sed -n -r '/^$/'p 1.txt

删除空行

# sed '/^$/'d 1.txt

删除包含数字的行

# sed '/[0-9]/'d 1.txt

删除包含字母的行

# sed '/[a-zA-Z]/'d 1.txt

删除指定行,如删除1-19行

# sed '/1,19/'d 1.txt

上述删除并没有直接删除文件内容只是在显示器上不显示。sed -i 选项就会将文件内容删除

[root@zekLinux ~]# wc -l 2.txt

33 2.txt

[root@zekLinux ~]# sed -i '1,19'd 2.txt

[root@zekLinux ~]# wc -l 2.txt

14 2.txt


替换功能

# sed '1,10s/nologin/login/g' 1.txt

含有特殊符号需脱意\ 如:# sed '1,10s/\/sbin\/nologin/login/g' 2.txt也可以替换为

# sed'1,10s@/sbin/nologin@logi@g' 2.txt

替换一整行

# sed '1,5s#^.*$#login#g' 2.txt

在尾部加上某字符串,如login

# sed '1,5s#^.*$#& login#g' 2.txt

将每行的数字删除

# sed 's#[0-9]##g' 2.txt

将除字母数字之外的字符删除

# sed 's#[^0-9a-zA-Z]##g' 2.txt

将每一行的第一段与最后一段交换

# sed -r 's#^([a-z]+)(:.*:)(.*$)#\3\2\1#g' 2.txt

# sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' /etc/passwd

理解:sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' /etc/passwd // 匹配第一段除":"的任意字符 匹配第二段


":任意字符: "第三段 也是除开":"的任意字符 \3\2\1 相当于把第一段和第三段对调

第一个字符与最后一个字符交换

sed -r 's/^(.)(.*)(.)$/\3\2\1/'

[root@zekLinux ~]# echo "abcdef"|sed -r 's/^(.)(.*)(.)$/\3\2\1/'

fbcdea


同时进行多个任务; -e

# sed -n '/root/p;/aming/'p 1.txt或者# sed -n -e '/root/p' -e '/aming/p' 1.txt

;特殊性若遇到一行既有root又有aming会打印两行,不同于|,|或只打印一行,;的意思是匹配到就打印。

[root@zekLinux ~]# sed -n -r '/root|aming/'p 1.txt

root: aming x:0:0:root:/root:/bin/bash

operatorrrrro:x:11:0:operator:/root:/sbin/nologin

aming123:x:501:513::/home/aming123:/bin/bash

[root@zekLinux ~]# sed -n '/root/p; /aming/p' 1.txt

root: aming x:0:0:root:/root:/bin/bash

root: aming x:0:0:root:/root:/bin/bash

operatorrrrro:x:11:0:operator:/root:/sbin/nologin

aming123:x:501:513::/home/aming123:/bin/bash


3、awk 命令 截取文段中的某段

-F 指定分隔符号为: 若分隔符号为特殊符号则用单引号' '

打印某段字符

# awk -F ':' '{print $3}' 1.txt

# awk -F ':' '{print $3,$4}' 1.txt

显示指定字符

# awk -F ':' 'OFS=":" {print $3,$4}' 1.txt

# awk -F ':' 'OFS="#" {print $3,$4}' 1.txt

匹配字符或字符串

# awk '/r/' 1.txt

# awk '/root|user/' 1.txt

 awk '/r*o/' 1.txt

# awk '/r?o/' 1.txt 

# awk '/r+o/' 1.txt

# awk '/r.*o/' 1.txt

匹配一个整体

# awk '/(oo)/' 1.txt

# awk '/(oooo)+/' 1.txt

按段匹配

# awk -F ':' '$1~/r*o/' 1.txt

# awk -F ':' '$1~/r*o/ {print $4}' 1.txt

多次匹配

# awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/user/ {print $1,$3}' 1.txt

若匹配时匹配要求同时满足时将打印两次(awk属于流式编辑器)

[root@zekLinux ~]# awk -F ':' '$1~/r*o/ {print $1,$4};$1~/nobody/ {print $1,$4}' 1.txt

rooooooooot 0

daemon 2

shutdown 0

operator 0

gopher 30

nobody 99

nobody 99

postfix 89

avahi-autoipd 170

haldaemon 68

[root@zekLinux ~]# awk -F ':' '$1~/r*o|nobody/ {print $1,$4}' 1.txt

rooooooooot 0

daemon 2

shutdown 0

operator 0

gopher 30

nobody 99

postfix 89

avahi-autoipd 170

haldaemon 68


awk 条件操作符 ==,>,<,>=,!=;<=

#  awk -F ':' '$1=="nobody"' 1.txt

nobody:x:99:99:Nobody:/:/sbin/nologin

# awk -F ':' '$1=="nobody"|| $1~/nolog/' 1.txt

# awk -F ':' '$4>=500' 1.txt

# awk -F ':' '$7!="/sbin/nologin"' 1.txt

匹配

# awk -F ':' '$7~/nolog/' 1.txt

# awk -F ':' '$7!~/nolog/' 1.txt

比较

# awk -F ':' '$3<$4' 1.txt

# awk -F ':' 'OFS=":";$3=$4' 1.txt 

# awk -F ':' '$3==$4' 1.txt

# awk -F ':' 'OFS=":";{if($4>5){$7=$3+$4}}' 1.txt

以空白字符为分隔符,把第一段等于'aming'并且第3段小于100的行过滤出来。(首先得有以空白字符为分隔符


的文件)

[root@zekLinux ~]# sed -i 's/:/ /g' 2.txt

[root@zekLinux ~]# awk '$1=="games" && $3<100' 2.txt

games x 12 100 games /usr/games /sbin/nologin


awk 内置变量 NF(段数) NR(行数)

# awk -F ':' 'NR==10' 1.txt 打印第十行

# awk -F ':' 'NR>10' 1.txt 打印10行以后的行

# awk -F ':' 'NR<10' 1.txt 

[root@zekLinux ~]# awk -F ':' 'NR==10 {print $1,$7}' 1.txt

uucp /sbin/nologin

[root@zekLinux ~]# awk -F ':' 'OFS=":"{if (NR==10) print $1,$7}' 1.txt

uucp:/sbin/nologin

[root@zekLinux ~]# awk -F':' '{print NF}' 1.txt

[root@zekLinux ~]# awk -F':' '{if (NF==7) print $1}' 1.txt

# awk -F':' '{print $NR,$NF}' 

NR是根据行在变化的,而NF就是这一行一共有多少段。

# awk -F ':' 'NR==10 {OFS="#";print $1,$7}' 1.txt

awk也可以经行数学运算

[root@zekLinux ~]# awk -F':' '$7=$3+$4' 1.txt

bin x 1 1 bin /bin 2

daemon x 2 2 daemon /sbin 4

adm x 3 4 adm /var/adm 7

lp x 4 7 lp /var/spool/lpd 11

sync x 5 0 sync /sbin 5

shutdown x 6 0 shutdown /sbin 6

halt x 7 0 halt /sbin 7

默认以空白符以分割符,若一个文本文档某一段发生了改变打印时就会默认以空白符为分隔符。需要用OFS来指


定分隔符。

[root@zekLinux ~]# awk -F':' 'OFS=":" {$7=$3+$4; print $0}' 1.txt

rooooooooot:x:0:0:root:/root:0

bin:x:1:1:bin:/bin:2

daemon:x:2:2:daemon:/sbin:4

adm:x:3:4:adm:/var/adm:7

lp:x:4:7:lp:/var/spool/lpd:11

sync:x:5:0:sync:/sbin:5

# awk -F':' 'OFS=":" {$7=$3+$4; print $1,$3}' 1.txt

计算某一段的总和,如第三段$3

[root@zekLinux ~]# awk -F':' '{sum=sum+$3};END {print sum}' 1.txt

4807

[root@zekLinux ~]# awk -F':' '{(sum=sum+$3)};END {print sum}' 1.txt

4807


{}

awk结构: awk -F ':' 'BEGIN{OFS=“:”} {if(条件){语句1;语句2;语句3}} END{语句}'

参考教程 http://www.cnblogs.com/emanlee/p/3327576.html











转载于:https://blog.51cto.com/wholelife/1733323

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux_note 命令grep,sed,awk 的相关文章

随机推荐

  • c语言菜单经典实例

    include lt conio h gt include lt dos h gt include lt graphics h gt include lt stdio h gt include lt stdlib h gt 定义一些常数 d
  • Mac 必备工具之 brew

    brew 是 Mac 下的一个包管理工具 xff0c 类似于 centos 下的 yum xff0c 可以很方便地进行安装 卸载 更新各种软件包 xff0c 例如 xff1a nodejs elasticsearch kibana mysq
  • ps:图像尺寸

    在课程 01中我们知道了显示器上的图像是由许多点构成的 xff0c 这些点称为像素 xff0c 意思就是 构成图像的元素 但是要明白一点 xff1a 像素作为图像的一种尺寸 xff0c 只存在于电脑中 xff0c 如同RGB色彩模式一样只存
  • WSL+cmder+oh-my-zsh美化win10命令工具(terminal)

    最近在win10下面搭建了一个 WSL 43 cmder 43 oh my zsh 的程序员命令行环境 xff0c 为什么呢 xff1f 还不是买不起mac xff0c 加上自己的黑苹果瘫了 xff0c 所有又回到了win10上面 不过上面
  • 计算机专业总人数所占比例公式,excel统计数据所占比例的教程详解

    Excel中经常需要统计数据所占的比例 xff0c 统计数据所占比例具体该如何操作呢 下面是学习啦小编带来的关于excel统计数据所占比例的方法 xff0c 希望阅读过后对你有所启发 excel统计数据所占比例的方法 统计数据所占比例步骤1
  • Android包管理机制(五)APK是如何被解析的

    本文首发于微信公众号 刘望舒 原文链接 xff1a APK是如何被解析的 xff1f 相关文章 包管理机制系列 前言 在本系列的前面文章中 xff0c 我介绍了PackageInstaller的初始化和安装APK过程 PMS处理APK的安装
  • 银河麒麟系统开机自动运行

    制作了一个deb安装包 xff0c 实现应用软件开机自启动 将Desktop文件放到 etc xdg autostart目录下 xff0c Desktop中Exec指向一个脚本文件 同样的脚本文件桌面菜单和开始菜单点击都是可以执行的 xff
  • SpringMvc+ajax 实现json格式数据传递

    传JSON对象 前端 function test var param 61 username 34 yitop 34 ajax timeout 20000 type 34 POST 34 dataType 34 JSON 34 url 34
  • 教你一招:windows批处理中实现延时的办法

    五种方法可以实现批出里的延时 xff0c 推荐使用方法一 xff0c 该方法也是使用最多的 方法一 用ping命令延迟 这是最简单而且是最常见的 xff1a 64 echo off echo 34 use ping to delay 34
  • 计算机与我的生活英语作文,描写一天的生活英语作文(通用7篇)

    描写一天的生活英语作文 通用7篇 在平凡的学习 工作 生活中 xff0c 大家都不可避免地要接触到作文吧 xff0c 作文要求篇章结构完整 xff0c 一定要避免无结尾作文的出现 相信很多朋友都对写作文感到非常苦恼吧 xff0c 下面是小编
  • Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

    Ubuntu通过LDAP集成AD域账号登录 xff08 libnss ldap方式 xff09 xff1a apt get install libnss ldap xff08 中间直接回车 xff0c 忽略 xff09 vi etc nss
  • 优秀的程序员需要擅长数学吗?

    天有很多年轻人或经验不足的程序员 在 论坛发帖 在 Stack Exchange 网站问 xff1a 为了成为优秀的程序员 xff0c 我需要擅长数学吗 xff1f xff0c 在我还年轻的时候 xff0c 我也问自己同样的问题 最近 xf
  • 阅读作业:大泥球、敏捷、人件

    34 大泥球 34 我了解到的就是这几点 xff1a 第一 xff0c 有很多条件促使大泥球产生 xff0c 包括 34 一次性代码 34 xff0c 时间紧缺 xff0c 急于完成最小集 xff0c 初期尝试 xff0c 功利主义等等 第
  • lubuntu自动登录(lxde)

    lubuntu 是个轻量级的发行版本 xff0c 非常简洁 xff01 值得一试 xff01 好吧 xff0c 上主题 xff0c 设置自动登录 xff08 两步 xff09 xff1a 1 etc lxdm default conf su
  • 常用照片尺寸

    照片规格 英寸 xff08 厘米 xff09 像素 数码相机类型 1寸 2 5 3 5cm 413 295 身份证大头照 3 3 2 2 390 260 2寸 3 5 5 3cm 626 413 小2寸 xff08 护照 xff09 4 8
  • spring boot application.properties 属性详解

    2019年3月21日17 09 59 英文原版 xff1a https docs spring io spring boot docs current reference html common application properties
  • linode中文社区 linodeclub

    Linode Manager管理后台的功能简介 xff01 Linode中文文档 xff08 原创或翻译 xff09 Linode中文社区 Linode讨论 Linode代购 Powered by Discuz 基本操作 Linode Ma
  • 关闭线程池:shutdown()方法与isTerminated()和awaitTermination()配合使用

    今天在项目中使用了线程池 xff0c 发现不会把线程关闭掉 xff0c 所以就看了这方面 xff0c 并作个记录 1 shutdown 和isTerminated 配合使用 目前项目中使用的shutdown 和isTerminated 配合
  • 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    本系列所有文章 如何一步一步用DDD设计一个电商网站 xff08 一 xff09 先理解核心概念 如何一步一步用DDD设计一个电商网站 xff08 二 xff09 项目架构 如何一步一步用DDD设计一个电商网站 xff08 三 xff09
  • Linux_note 命令grep,sed,awk

    1 grep 过滤出指定的行 grep cinvABC 39 word 39 filename color 把匹配到的关键词用红色标识 如 xff1a grep color 39 root 39 etc passwd c xff1a 打印符