文本流常见命令

背景

昨天看Nginx时,看博文中有一些很有意思的文本操作的linux命令自己不曾了解,现下单独分类记述

知识点

常见

1
2
3
4
5
6
7
8
9
# 查看所有的内容
cat [文件名称]

# 查看文本文件的前十行
head [文件名称]

# 查看文本内容,支持翻页
less [文件名称]
more [文件名称]

tail命令:动态显示

1
2
# tail命令可以动态的在命令行窗口刷新文本的内容部分
tail -f [文件名称]

egrep:内容检索

命令格式

1
2
3
4
5
6
7
# egrep = grep -e
egrep [option] [正则表达式] [文件名]

# option常用的参数有以下几种:
-v:匹配的内容取反
-o:只展示匹配上的内容,不展示匹配内容所在行的所有信息
-i:忽略大小写的匹配

egrep的正则元字符:

  • 字符匹配

    字符 匹配内容 说明
    . 匹配任意字符
    [内容] 匹配范围内的任意字符 如:[1-9]
    [^内容] 匹配范围外的任意字符 如:[ ^a-z]
  • 次数匹配

    字符 匹配内容 说明
    * 匹配任意次
    ? 匹配0到1次
    + 匹配至少一次
    {m} 匹配m次
    {m,n} 匹配至少m次,至多n次
    {m, } 匹配至少m次
    {0,n} 匹配最多n次
  • 匹配位置

    字符 匹配内容 说明
    ^ 匹配行首
    $ 匹配行尾
    ^$ 匹配空行
  • 分组

    字符 匹配内容 说明
    (正则表达式) 分组,也可以将内容部分划分为一个整体
    正则1 | 正则2 或关系
  • 引用

    字符 匹配内容 说明
    \n 匹配表达式前n个括号内正则匹配的内容,n起始数从1开始

diff:文本比较

  • 介绍

    • diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配。

    • diff用于分析两个文件,并输出两个文件的不同的行。

    • diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。

    • diff同样支持目录

  • 比较文件命令格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    diff [option] [文件a] [文件b]

    # 常用比较模式
    -c:查阅context模式下的结果,它的输出结果更加人性化
    -u:Unified模式,在-c模式下简化展示

    # 常用比较参数
    -b:忽略空格,如果两行进行比较,多个连续的空格会被当作一个空格处理,同时会忽略掉行尾的空格差异。
    -w:忽略所有空格,忽略范围比-b更大,包括很多不可见的字符都会忽略。
    -B:忽略空白行。
    -y:输出两列,一个文件一列,有点类似GUI的输出外观了,这种方式输出更加直观。
    -W:大写W,当指定-y的时候设置列的宽度,默认是130
    -i:忽略两个文件中大小写的不同

    image-20200917200801874

    diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。我们看看上面的比较结果中的第一行 2,4c2,4 前面的数字2,4表示第一个文件中的行,中间有一个字母c表示需要在第一个文件上做的操作(a=add, c=change, d=delete),后面的数字2,4表示第二个文件中的行。

    2,4c2,4 的含义是:第一个文件中的第[2,4]行(注意这是一个闭合区间,包括第2行和第4行)需要做出修改才能与第二个文件中的[2,4]行相匹配。接下来的内容则告诉我们需要修改的地方,前面带 < 的部分表示左边文件的第[2,4]行的内容,而带> 的部分表示右边文件的第[2,4]行的内容,中间的 — 则是两个文件内容的分隔符号。

  • 比较目录命令格式

    1
    2
    3
    4
    5
    6
    # 比较目录默认会比较指定目录下的文件,以及文件中不同的内容
    # -r:表示递归比较当前目录及其子目录中的内容
    # -q:表示只会列出目录中不同的文件名,而不列出文件不同的部分
    diff -r -q [目录1] [目录2]

    # -x:--exclude=PAT 比较目录的时候排除指定PAT模式的文件名的比较
  • 同步文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -e:将比较的结果保存成一个ed脚本,之后ed程序可以执行该脚本文件,从而将file1修改成与file2的内容相同,这一般在patch的时候有用。

    # 将比较结果放置到一个文件中
    diff -e 1.txt 2.txt > script.txt

    # 在脚本文件末尾追加write指令:“w”
    echo "w" >> script.txt

    # 使用脚本重定向回要修改的文件,-表示从标准输入中读取
    ed - 1.txt < script.txt
  • Context模式:富文本比较模式

    image-20200917173440585

  • Unified模式:简要显示模式

    image-20200917173623764

sed:字符流解决方案

  • 介绍

    sed默认是显示修改后内容,不会修改原文件,除非使用**-i** 参数。

  • 命令格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sed [option] [command] [文件名]

    # 常用参数
    -e:可以指定多个命令
    -f:指定命令文件
    -n:取消默认控制台输出,与p一起使用可打印指定内容
    -i:将修改的内容回改到源文件,静默执行

    # command中的参数
    a:新增内容
    c:修改内容
    d:删除内容
    i:插入内容
    p:打印内容,要和-n参数一起使用
    s:替换(匹配局部替换)
  • 常用案例

    命令 效果
    sed ‘2a file’ text.txt 在第2行后面新增一行内容
    sed ‘1,3a file’ text.txt 在第1~3行后面各新增一行内容
    sed ‘1,3c file’ text.txt 将第1~3行内容替换成1行内容
    sed ‘1,3d’ text.txt 将第1~3行内容全部删除
    sed ‘1,3i file’ text.txt 在1~3行前面各追加一行内容
    sed -n ‘1,3p’ text.txt 只打印1~3行的内容
    sed -n ‘1,3!p’ text.txt 打印除1~3行的内容
    sed -n ‘s/old/new/gp’ test 只打印匹配替换的行,g表示匹配一行多个
    sed ‘s/old/new/‘ test.txt 匹配每一行的第一个old替换为new
    sed ‘s/old/new/gi’ test.txt 匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写
    sed ‘3,9s/old/new/gi’ test.txt 匹配第 3~9 行所有old替换为new
    sed -e ‘s/系统/00/g’ -e ‘2d’ test.txt 执行多个指令
    sed -f ab.log test.txt 多个命令写进ab.log文件里,一行一条命令,效果同-e

/dev/null:黑洞文件

  • 介绍

    • /dev/null属于字符特殊文件,它属于空设备,是一个特殊的设备文件,它会丢弃一切写入其中的数据,写入它的内容都会永远丢失,而且没有任何可以读取的内容。

    • Linux的输出分为标准输出和标准错误输出,它的输出对象默认情况下都是屏幕,其中可以用数字表示输出:

      0:表示标准输入流(stdin)

      1:表示标准输出(stdout),若没有指定,则默认为该数

      2:表示标准错误输出(stderr)

  • 命令

    1
    2
    # 有时候运行一些自动化的命令,会有输出,此时我们可以将这些内容重定向到黑洞中
    sed '2a file' text.txt > /dev/null 2>&1

脑图

文本流常见命令

参考

常见文本查看:https://blog.csdn.net/qq_41116956/article/details/82862295

egrep命令:https://www.cnblogs.com/tsw1107/p/2264a01aeec481d2044dfeda01417c64.html

diff命令:https://www.cnblogs.com/machangwei-8/p/9572036.html

sed命令:https://www.cnblogs.com/zhangzongjian/p/10708222.html

/dev/null:https://www.cnblogs.com/kexianting/p/11630085.html