首页 > 系统相关 >linux三剑客sed、grep、awk

linux三剑客sed、grep、awk

时间:2022-09-22 14:36:34浏览次数:57  
标签:sbin grep gjm ssstr sed awk root testfile 三剑客

linux中最重要的三个命令称为三剑客,分别是sed、grep、awk

但是在学习这三个命令之前,首先需要了解一下正则表达式

1.正则表达式

 

元字符 功能 含义
^ 匹配行首 表示以某个字符开头
$ 匹配行尾 表示以某个字符结尾
^$ 空行 表示空行的意思
. 匹配任意单个字符 表示任意一个字符
* 匹配0或多个重复字符 表示重复的任意多个字符
\ 屏蔽一个元字符的特殊含义 表示去掉有意义的元字符的含义
[] 匹配中括号内的字符 表示过滤括号内的字符
.* 匹配任意多个字符 就是代表任意多个字符
lele\{n\} 用来匹配前面lele出现次数。n为次数 就是统计前面lele出现的次数
lele\{n,\} 含义同上,但次数最少为n 从功能就可以看出
lele\{n,m\} 同上,但lele出现次数在n与m之间 从功能也可以看出

2.sed

sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法:

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息。

动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

实例

先创建一个testfile文件,内容如下:

HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Runoob
Tesetfile
Wiki

然后需要使用sed对第四行下一行添加一行的操作

[root@gjm ssstr]# sed -e 4a\newLine testfile 
HELLO LINUX!
Linux is a free unix-type operating system.
This is a linux testfile!
This is a linux testfile!
newLine
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
[root@gjm ssstr]# sed -e 4a\newLine testfile -n
newLine

如果加上-n参数则只显示受到修改的一行

然后将testfile的内容列出并且列印行号,同时删除2-5行

[root@gjm ssstr]# nl testfile | sed '2,5d'
     1  HELLO LINUX!
     6  Google
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki

-e参数可以不写,但是不写的情况,后面的操作需要加上‘...’单引号包起来

只删除第二行

[root@gjm ssstr]# nl testfile | sed '2d'
     1  HELLO LINUX!
     3  This is a linux testfile!
     4  This is a linux testfile!
     5  Linux test
     6  Google
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki

删除第三行到最后一行

[root@gjm ssstr]# nl testfile | sed '3,$d'
     1  HELLO LINUX!
     2  Linux is a free unix-type operating system.

在第二行后加入drink tea?字样

[root@gjm ssstr]# nl testfile | sed '2a drink tea?'
     1  HELLO LINUX!
     2  Linux is a free unix-type operating system.
drink tea?
     3  This is a linux testfile!
     4  This is a linux testfile!
     5  Linux test
     6  Google
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki

如果是第二行前

[root@gjm ssstr]# nl testfile | sed '2i drink tea?'
     1  HELLO LINUX!
drink tea?
     2  Linux is a free unix-type operating system.
     3  This is a linux testfile!
     4  This is a linux testfile!
     5  Linux test
     6  Google
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki

如果增加两行以上

[root@gjm ssstr]# cat testfile | sed '2a Drink tea or ...\ndrink beer?'
HELLO LINUX!
Linux is a free unix-type operating system.
Drink tea or ...
drink beer?
This is a linux testfile!
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki

替换与显示

将第2-5行的内容替换成No 2-5 number

[root@gjm ssstr]# nl testfile | sed '2,5c No 2-5 number'
     1  HELLO LINUX!
No 2-5 number
     6  Google
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki

显示文件的第5-7行

[root@gjm ssstr]# nl testfile | sed '5,7p'
     1  HELLO LINUX!
     2  Linux is a free unix-type operating system.
     3  This is a linux testfile!
     4  This is a linux testfile!
     5  Linux test
     5  Linux test
     6  Google
     6  Google
     7  Taobao
     7  Taobao
     8  Runoob
     9  Tesetfile
    10  Wiki
[root@gjm ssstr]# nl testfile | sed '5,7p' -n
     5  Linux test
     6  Google
     7  Taobao

这里最好加上-n参数,不然比较难看清楚

数据搜索并显示

搜索与oo关键字的行

[root@gjm ssstr]# nl testfile | sed -n '/oo/p'
     6  Google
     8  Runoob

数据搜寻并删除

删除了所有包含oo关键字的行,输出其他行

[root@gjm ssstr]# nl testfile | sed  '/oo/d'
     1  HELLO LINUX!
     2  Linux is a free unix-type operating system.
     3  This is a linux testfile!
     4  This is a linux testfile!
     5  Linux test
     7  Taobao
     9  Tesetfile
    10  Wiki

数据搜寻并执行命令

找到有oo关键词的行,执行花括号中的一组命令,每个命令之间用分号分割,这里把oo替换为kk,在输出

[root@gjm ssstr]# nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'
     6  Gkkgle

将查询出的ip取出来

[root@gjm ssstr]# ip a s ens33 | sed '3p'
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:14:7d:cc brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.144/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
    inet 192.168.10.144/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1151sec preferred_lft 1151sec
    inet6 fe80::3a7c:e2d1:fff4:da11/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@gjm ssstr]# ip a s ens33 | sed '3p' -n | sed  's/brd.*//g' | sed 's/^.*net //g'
192.168.10.144/24 

注意,如果加上-i则会很危险,会对文件直接进行操作

3.grep

文本过滤(模式:pattern)工具,grep, egrep

grep [OPTIONS] PATTERN [FILE...]
--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,不支持正则表达式

 

查找文件内容包含root的行数

[root@gjm ssstr]# grep -n root passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

查找文件内容不包含root的行

[root@gjm ssstr]# grep -nv root passwd 
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt

查找以s开头的行

[root@gjm ssstr]# grep -n ^s passwd 
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
20:saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
34:setroubleshoot:x:991:985::/var/lib/setroubleshoot:/sbin/nologin
35:saned:x:990:984:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
38:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

查找以n结尾的行

[root@gjm ssstr]# grep -n n$ passwd 
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin

4.awk

报告生成器,格式化文本输出,有多种版本:New awk(nawk),GNU awk( gawk)

awk [-F|-v] '行数筛选{XXX;XXX;printf “”,XXX,XXX}'

-F 指明输入时用到的字段分隔符
-v var=value 自定义变量

awk执行时,由分隔符分隔的字段(域)标记1,1,2..n称为域标识,n称为域标识,0为所有域。
省略action,则默认执行 print $0 的操作。

FS:输入字段分隔符;OFS:输出字段分隔符;RS:输入记录分隔符;ORS:输出记录分隔符;NF:字段数量;NR:记录号;NFR:各文件分别计数,记录号。FILENAME:当前文件名;ARGC:命令行的参数;ARGV:数组,保存的是命令行所给定的各参数

printf命令

printf “FORMAT” , item1, item2, ... 不会自动换行,FORMAT中需要分别为后面每个item指定格式符。

1.格式符
格式符 Item表现形式
%c 显示字符的ASCII码
%d,%i 显示十进制整数
%e,%E 显示科学计数法数值
%f 显示为浮点数
%g,%G 以科学计数法或赋点形式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身
2.修饰符  
格式符 Item
#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
- 左对齐(默认右对齐)%-15s
+ 显示数值的政府符号%+d
操作符

算术操作符:x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
比较操作符:==, !=, >, >=, <, <=
模式匹配符:~:左边是否和右边匹配包含 !~:是否不匹配
逻辑操作符:与&&,或||,非!
函数调用:function_name(argu1, argu2, ...)
条件表达式(三目表达式):selector?if-true-expression:if-false-expression

PATTERN:根据pattern条件,过滤匹配的行,再做处理

如果未指定:空模式,匹配每一行
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
relational expression: 关系表达式,结果为“真”才会被处理
line ranges:行范围 startline,endline:/pat1/,/pat2/不支持直接给出数字格式
BEGIN/END模式

awk控制语句

1.{ statements;… } 组合语句
2.if(condition) {statements;…}
3.if(condition) {statements;…} else {statements;…}
4.while(conditon) {statments;…}
5.do {statements;…} while(condition)
6.for(expr1;expr2;expr3) {statements;…}
7.break
8.continue
9.delete array[index]
10.delete array
11. exit

 

打印文件第一列

[root@gjm ssstr]# awk -F ':' '{print $1}' passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail

输出字符1,3,6,以制表符作为分隔符

[root@gjm ssstr]# awk -F : '{print $1,$2,$3,OFS="\t"}' passwd 
root    x       0
bin     x       1
daemon  x       2
adm     x       3
lp      x       4
sync    x       5

 

查询到ip地址并使用awk取出来

[root@gjm ssstr]# ip a s ens33 | grep -v inet6 | grep inet| awk -F " " '{print $2}'
192.168.10.144/24

 

 

标签:sbin,grep,gjm,ssstr,sed,awk,root,testfile,三剑客
From: https://www.cnblogs.com/gjm-study-test/p/16717504.html

相关文章

  • 第十一章 awk命令
    一、awk简介1)awk介绍awk命名源自于它的三大作者名字的首字母,分别是AlfredAho、BrianKernighan、PeterWeinberger。(gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些......
  • Linux三剑客之一——sed学习
    1.sed理论1.1语法1.2选项1.3sed的内置命令字符2.实际练习3.总结 1.sed理论1.1语法sed[选项][sed内置命令字符][输入文件](脚本语法)1.2选项......
  • 使用cat xxx|grep 查找条件时,报:Binary file (standard input)matches
    从报错信息来看,cat的文件是一个二进制文件,不能直接grep查找条件进行查找,需要修改为grep-a查找命令。有几个点需要解决:1.什么是二进制文件?2.为什么二进制文件不能直接......
  • Linux三剑客之一——grep及正则表达式的学习
    1.grep理论1.1grep作用1.2grep参数及说明1.3 基本正则表达式BRE集合1.4 扩展正则表达式ERE集合2.grep实践2.1grep基本参数2.2 grep正则表达式3.总结 1.gr......
  • 从零开始学python必看,“Python编程三剑客”,你值得拥有
    从0开始学Python,就问你一句:慌不慌?   第一本:《Python编程:从入门到实践》   第二本:《Python编程快速上手-让繁琐工作自动化》   第三本:《《Python极客......
  • linux grep命令详解
    linuxgrep命令详解-ggjucheng-博客园 https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html简介grep(globalsearchregularexpression(RE)and......
  • linux awk数组操作详细介绍
    linuxawk数组操作详细介绍-程默-博客园 https://www.cnblogs.com/chengmo/archive/2010/10/08/1846190.html用awk进行文本处理,少不了就是它的数组处理。那么awk数......
  • linux awk命令详解
    linuxawk命令详解-ggjucheng-博客园 https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html简介awk是一个强大的文本分析工具,相对于grep的查找,sed......
  • 04_Linux基础-.&..-cat-tac-重定向-EOF-Shell-more-ps-less-head-tail-sed-grep-which
    04_Linux基础-.&..-cat-tac->&>>-EOF-Shell-more-ps-less-head-tail-sed-grep-which-whereis-PATH-bash-/usr-locate-find一.回顾回顾// 将/home/目录下的所有文件和......
  • linux AWK
    $cat1.txt./smp_ao_stafpotl_info.log.2020-07-23-AM:2020-07-2309:36:22,655898582491[WebContainer:1]ERRORcom.group.bussvc.stafpotl.service.AppListTypeS......