grep

grep 命令用于查找文件里符合条件的字符串,即查找内容包含制定的范本样式的文件,如果发现某文件的内容符合制定的范式样本,则会把含有范式样本的那一行显示出来

语法 grep 选项 需要捕获的文字 目标文件,比如从 /etc/passwd 中查找tcpdump相关的信息 grep tcpdump /etc/passwd

选项主要使用的有:

  • -A 显示捕获行之后的行
  • -B 显示捕获行之前的行
  • -C 显示捕获行前后的行
  • -c 显示符合条件的行数
  • -i 忽略大小写
  • -n 输出符合条件文件所在行号
  • -v 不包含关键字的行

比如:过滤以#开头的行 grep -v '^#' /etc/ssh/sshd_config
过滤以#开头的行和空行 grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'


正则表达式

在上面最后的例子中, '^#''^$' 都是正则表达式的匹配法

正则表达式(regular expression) 描述了一种字符串的匹配模式,可以用来检测一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等

一些正则表达式的测试网站:
https://regex101.com/
https://tool.oschina.net/regex/

匹配普通字符

普通字符包括没有显示制定为元字符的所有可打印和不可打印字符,包括所有大小写字母,数字,标点符号和一些其他符号

[] 中的字符就是要匹配的字符,
[aeiou] 单个匹配中括号中的这几个字符
[^aeiou] 单个匹配不是中括号中这几个的其他字符
[a-z] 匹配a到z的所有字母
[\s] 匹配所有空白字符,包括换行,制表,换页等
[\S] 匹配非空白符
[.] 匹配除换行符之外的任意单个字符
[\w] 匹配字母数组下划线

\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符

特殊字符

限定符

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如^*之类的表达式。

选择

使用圆括号 () 将所有选项括起来,相邻的选项之间使用 | 来分隔,() 表示捕获分组,() 会把每个分组里的匹配值保存起来,多个匹配值可以通过数字来索引

1
2
3
n="123456runoob123runoob456".match(/([1-9])([a-z]+)/g)
// 这里n是一个对象,可以通过索引来查看两个捕获值
n[0],n[1]

grep 与 正则结合

前面使用 gerp -v ^$ 这类正则表达式是grep自身支持的,如果想要使用完整的正则语法,可以使用 grep -E 或者写作 egrep


sed 编辑器

sed概述

Sed 是一个流处理编辑器,它能帮助我们自动处理文件,分析日志文件,修改配置文件等,是一个 “非交互式的” 面向字符流的编辑器,能同时处理多个文件多行的内容

  • 可以不对原文件改动,把整个文件输出到屏幕
  • 可以把匹配到的内容输出到屏幕上
  • 还可以对原文件改动,但是不会在屏幕上返回结果

sed处理流程

sed参数说明

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

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

sed动作可以理解为操作

  • a :新增,a的后面可以接字符串,新增字符串会在目前的下一行
  • c :取代,c的后面可以接字符串,这些字符串取代n1,n2之间的行
  • d :删除
  • i :插入,i的后面可以接字符串,新增的字符串会在目前行的上一行
  • p :打印,将某个选择的数据先输出,通常p会与参数sed -n 一起运行
  • s :替换,可以直接进行替换,通常这个s的动作可以搭配正则表示

sed示例

有如下文件 test.txt

1
2
3
4
5
Hello 11111
Hello 22222
Hello 33333
Hello 44444
Hello 55555
  1. 在文件中查找包含2222的行

    1
    cat test.txt | sed -n '/2222/p'
  2. 在文件中添加第三行,内容为 hello

    1
    sed -e '2a hello' test.txt
  3. 删除第2行到第4行

    1
    sed -e '2,4d' test.txt
  4. 删除包含222222的行

    1
    sed -e '/22222/d' test.txt
  5. 把 1-3行替换为 hahaha

    1
    sed -e '1,3c hahaha' test.txt
  6. 查找替换,将文本中的Hello换成haha

    1
    sed -e 's\Hello\haha\g' test.txt

修改文件

前面的操作,知识在屏幕上按照要求输出了内容,而文件本身没有改变,sed也可以用于文件自身的修改,但这样操作非常危险,有可能误操作将文件改坏,所以我们必须有把握才能这么做

在什么的操作中,结合 -i 就可以修改文件了,比如

1
2
sed -i -e '2a hello' test.txt
sed -i '2,4d' test.txt

awk

awk简介

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理,支持用户自定义函数和动态正则表达式的功能,是 linux/unix 下的一个强大编程工具

awk一次处理一行内容,对每行可以切片处理,空格和制表符为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk格式

命令行格式

awk [选项参数] 'script' var=value file(s)

script组成: pattern {awk操作命令}

  • pattern:正则表达式;逻辑判断式
  • awk操作命令:内置函数 print(),printf(),getline…;
  • 控制命令:if(){..}else{..};while(){…}

扩展格式:BEGIN{print “start”}pattern{commands}END{print “END”} **
注意:加粗的部分在所有commands
之前
之后**执行

awk内置参数

  1. 内置变量1:

    • $0 表示整个当前行
    • $1 每行第一个字段
  2. 内置变量2;

    • NR 每行的记录号,行号
    • NF 字段数量变量,字段总数
    • FILENAME 正在处理的文件名

awk示例

  1. : 分割,显示/etc/passwd 的第一列

    1
    awk -F : '{print $1}' /etc/passwd
  2. 显示/etc/passwd的第一列和第七列,用逗号分隔显示,所有行开始前添加列名 start1,start7

    1
    awk -F : 'BEGIN{print "start1,start7"}{print $1","$7}END{print "end1,end7"}' /etc/passwd
  3. 匹配某段字符

    1
    awk -F : '$1 ~ /00/' /etc/passwd
  4. 显示前五行的行号,列数,以及行内完整内容

    1
    head -n5 /etc/passwd | awk -F : '{print NR " " NF " " $0}'
  5. 条件匹配操作

    1
    awk -F : '$3=="0"' /etc/passwd
    这里操作符号可以用 `==`,`>`,`>=`,`<`,`<=`,`!=` 等,和数字比较时,将数字用双引号引起来表示字符串,不加引号表示数字
  6. 累加前四行用户的uid

    1
    head -n4 /etc/passwd | awk -F : '{(sum=sum+$3);print $0}END{print sum}'
  7. 流程控制

    1
    awk -F : '{if($1>"q"){print $1}else{print "-"}}' /etc/passwd
    也可以将上面的语句放在一个脚本中去调用,比如在`awkscript`这个文件中写入下面的脚本
    1
    2
    3
    4
    5
    6
    7
    8
    {
    if($1 > "q"){
    print $1
    }
    else{
    print "-"
    }
    }
    使用下面的命令去调用
    1
    awk -F : -f awkscript /etc/passwd