天天看点

8-文本处理工具1. 查看文件2 文件整理、排序3 文件比较

文章目录

  • 1. 查看文件
    • 1.1 cat
    • 1.2 more
    • 1.3 less
    • 1.4 head
    • 1.5 tail
    • 1.6 paste
  • 2 文件整理、排序
    • 2.1 cut
    • 2.2 wc
    • 2.3 sort
    • 2.4 uniq
  • 3 文件比较
    • 3.1 diff && patch
      • 3.1.1 diff用法
      • 3.1.2 diff补丁用法
      • 3.1.3 ed编辑器
    • 3.2 patch

1. 查看文件

1.1 cat

cat:连接文件或标准输入并打印
  • 语法:

    cat [OPTION]... [FILE]...

  • OPTIOSN:
    • -E:显示行结束符$
    • -n:对显示出的每一行进行编号
    • -A:显示所有控制符
    • -b:非空行编号
    • -s:压缩连续的空行成一行
  • 主要功能:
    1. 一次显示整个文件。

      $ cat filename

    2. 从键盘创建一个文件。

      $ cat > filename

      只能创建新文件,不能编辑已有文件.
    3. 将几个文件合并为一个文件:

      $cat file1 file2 > file

tac :逆向显示cat的输出,rev 则是直接输出 列的逆序,tac为行的逆序

1.2 more

more:分页查看文件
  • 语法 :

    more [OPRIONS...] FILE...

  • OPTIONS:
    • +n : 从笫n行开始显示
    • -n : 定义屏幕大小为n行
    • +/pattern : 在每个文件中显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
    • -d : 显示翻页即退出提示
    • -c : 从顶部清屏,然后显示
    • -s : 把连续的多个空行显示为一行
  • 常用操作
    • Enter : 向下n行,需要定义。默认为1行
    • Ctrl+F : 向下滚动一屏
    • 空格键 : 向下滚动一屏
    • Ctrl+B : 返回上一屏
    • = : 输出当前行的行号
    • :f 输出文件名和当前行的行号
    • V : 调用vi编辑器
    • 按H键:显示帮助屏,该屏上有相关的帮助信息。
    • !命令 : 调用Shell,并执行命令
    • q : 退出more
[[email protected] ~]# more +/22:06:05 log.ctdb-20180722

...skipping
2017/12/12 22:05:35.447466 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:05:50.672362 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:05.893017 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:21.099632 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:36.304641 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:51.510972 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error

           

1.3 less

less :一页一页的查看文件或STDIN输出
  • 语法:less [OPTIONS] filename
  • OPTIONS :
    • -e : 当文件显示结束后,自动离开
    • -f : 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
    • -i : 忽略搜索时的大小写
    • -N : 显示每行行号
    • -s : 显示连续空行为一行
  • 基本操作 :
    • : /文本 搜索文本
    • n/N 跳到下一个 或上一个匹配
    • b : 向后翻一页
    • d : 想后翻半页
    • h : 显示帮助界面
    • Q : 退出less命令
    • u : 向前滚动半页
    • y : 向前滚动一行
    • 空白行 : 滚动一行
    • 回车键 : 滚动一页
    • [pagedown] :向下翻动一页
    • [pageup] : 向上翻动一页
    • F : 类似

      tail -f

    • gg : 调到文本的最前面
    • G : 调到文本末尾
    • v : 直接编辑当前文件
    • :e file2
正在浏览一个文件时,使用:e 打开另一个文件
less file1
: e file2
           
浏览多个文件
less log2013.log log2014.log
:n 后,切换到log2014.log
:p 后 ,切换到log2013.log

           
less使用的分页项命令与man类似

生成指定位数的随机口令:

  • cat /dev/urandom | tr -dc '[:alnum:]' | head -c20

  • tr -dc '[:alnum:]_' </dev/urandom | head -c20

  • openssl rand -base64 30 |head -c20

1.4 head

查看文件中开头的几行
  • 语法 :

    head [OPTION]... [FILE]

  • OPTIONS
    • -c# :指定获取前#字节
    • -n#: 指定获取前#行
    • -#:指定行数

1.5 tail

查看文件结尾的几行
  • 语法 :

    tail [OPTION]... [FILE]...

  • OPTIONS
    • -c# 指定获取后#字节
    • -n # 指定获取后#行 //n可以省略
    • +n # : 从倒数第五行开始显示显示五行
    • -f : 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor
  • -F :跟踪文件名,相当于–follow=name --retry
tailf 类似tail -f ,当文件不增长时并不访问文件,这个对于机器的负载相对于tail -f 要低一点

1.6 paste

paste合并两个文件同行号的列到一行
  • 语法:

    paste[OPTION]...[FILE]...

  • OPTIONS
    • -d分隔符:指定分隔符,默认用TAB
    • -s:所有行合成一行显示
paste f1 f2  //f1与f2同一行号的放在同一行中显示
paste -s f1 f2  //将文件f1所有字符合并成第一行显示, f2合并成第二行显示
           

2 文件整理、排序

2.1 cut

用来显示行中的指定部分,删除文件中指定字段。显示文件或STDIN数据的指定列
  • 语法:

    cut [OPTION]...[FILE]...

  • OPTIONS
    • -d DELIMITER:指定分隔符,默认tab
    • -f FILEDS:
      • #:第#字段
      • #,#[,#]:离散的多个字段,例如1,3,6
      • 混合使用:1-3,7
      • #- :从#开始字段、字节、字节之后的所有字段
      • -# :从开始到#字符、字段、字节
    • -c : 按字符切割
    • -b : 按字节切割
    • –complement: 选项提取指定字段之外的列;
    • –output-delimiter=STRING 指定输出分隔符

示例:

cut -d: f1 /etc/passwd
cat /etc/passwd | cut -d: -f7

[[email protected] ~]# cut -c1- 1
abcdefghijklm n
abc defghijklmn
abcdefgh ijklmn
abcd efghijklmn
[[email protected] ~]# cut -c1-5 1
abcde
abc d
abcde
abcd 
[[email protected] ~]# cut -b1-5 1
abcde
abc d
abcde
abcd 
[[email protected] ~]# cut -b1-5 --complement 1
fghijklm n
efghijklmn
fgh ijklmn
efghijklmn

[[email protected] ~]# cut -c1,5 1
ae
ad
ae
a 

           
默认的分隔字符是制表符(\t table键)

2.2 wc

wc :收集文本统计数据。

计数单词总数,行总数,字节总数和字符总数

wc sotry.txt
39   237   1901 story.txt
行数 字数  字节数
           

常用选项:

  • -l 只计数行数
  • -w 只计数单词总数
  • -c 只计数字节总数
  • -m 只计数字符总数
  • -L 显示文件中最长行的长度

2.3 sort

文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件

  • 语法:

    sort [OPTIONS] files

  • OPTIONS:
    • -r : 执行反方向(由上至下)整理
    • -n : 执行按数字大小整理
    • -f : 选项忽略(FOLD)字符串中的字符大小写
    • -u : 选项(独特,unique)删除输出中的重复行
    • -t c : 选项使用c作为字段界定符
    • -k X : 选项按照使用c字符分隔X列来整理能够使用
    • -c : 检查文件是否已经按照顺序排序;
[[email protected] ~]# sort -c /etc/passwd
sort: /etc/passwd:2: disorder: bin:x:1:1:bin:/bin:/sbin/nologin

#只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

# 从公司英文名称的第二个字母开始进行排序:
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
           
-k:这个选项中1.2表示从第一个字段第二个字母开始排序,1.2,1.2,排序顺序是从第一字段的第二个字母开始到,到第一个字段的第二个字母结束。如果-k # : #字段相同时,会继续在后一个字段中开始比较。

2.4 uniq

uniq命令用于检查及删除文本文件中重复出现的行列
  • 语法:

    uniq [OPTION]...[FILE]...

  • OPTIONS
    • -c:显示每行重复出现的次数
    • -d:仅显示重复过的行
    • -u:仅显示不曾重复的行
连续且完全相同方为重复

常和sort 命令一起配合使用:

sort userlist.txt | uniq -c

3 文件比较

3.1 diff && patch

一行一行比较文件

3.1.1 diff用法

  • 语法 :

    diff [OPTION]... FILES

  • OPTIONS
    • -b : 忽略空格造成的不同
    • -B : 忽略空行造成的不同
    • -r : 比较子目录中的文件
    • -u : 以合并的方式来显示文件内容的不同。多用于补丁
    • -y : 可以将屏幕分成左右两部分,来比较两个文件之间的差异。
    • -a : diff预设只会逐行比较文本文件;
    • -c:显示全部内容,并标出不同之处;
    • -n或–rcs:将比较结果以RCS的格式来显示
    • -N或–new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
    • -q或–brief:仅显示有无差异,不显示详细的信息;
    • -x<文件名或目录>或–exclude<文件名或目录> : 不比较选项中所指定的文件或目录;
    • -X<文件>或–exclude-from<文件> : 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
    • -e 将比较的结果保存成一个ed脚本,之后ed程序可以执行该脚本文件,从而将file1修改成与file2的内容相同,这一般在patch的时候有用

-e :使用示例

[[email protected] ~]# cat 1
11
888
999
55
55
[[email protected] ~]# cat 1.ls 
11
22
33
55

[[email protected] ~]# diff -e 1 1.ls 
5a

.
2,4c
22
33
.
[[email protected] ~]# diff -e 1 1.ls  > script.txt
[[email protected] ~]# cat script.txt 
5a

.
2,4c
22
33
.
[[email protected] ~]# echo "w"  >> script.txt 
#这样就是生成了一个ed可以执行的脚本文件script.txt,生成脚本文件之后我们还需要做一个操作, 在脚本文件末尾添加ed的write指令,只需要执行 echo "w" >>script.txt 将w指令附加到脚本文件的最后一行即可。
[[email protected] ~]# ed  - 1 < script.txt 
[[email protected] ~]# cat 1
11
22
33
55

注意中间的 – 符号表示从标准输入中读取,而 < script.txt 则重定向script.txt的内容到标准输入。这样执行之后1的内容将与1.ls完全相同。

           

普通模式

8-文本处理工具1. 查看文件2 文件整理、排序3 文件比较
[[email protected] ~]# diff 1 2
3c3
< 
---
> aa
7c7
< 
---
> bb
这个命令中显示,<表示文件1,>表示文件2,显示左右文件内容之间的区别。
           
8-文本处理工具1. 查看文件2 文件整理、排序3 文件比较
[[email protected] ~]# diff -c 1 2
*** 1	2018-10-17 12:47:24.971679928 -0400
--- 2	2018-10-17 12:47:45.252865409 -0400
***************
*** 1,4 ****
  apples
! oranges
  kiwis
  carrots
--- 1,5 ----
  apples
! 
  kiwis
  carrots
+ grapefruits
上面为文件1 ,下面为文件2.表示区别的地方, + 表示该文件中多的内容


[[email protected] ~]# diff -u 1 2
--- 1	2018-10-17 12:47:24.971679928 -0400
+++ 2	2018-10-17 12:47:45.252865409 -0400
@@ -1,4 +1,5 @@
 apples
-oranges
+
 kiwis
 carrots
+grapefruits

左边用-号,右边为+号。 -oranges,+ 表示左边与区别的内容,+grapefruits ,表示右边文件多出的内容,使用方式与-c方式类似。

[[email protected] ~]# cat test1/
2  3  6  
[[email protected] ~]# cat test2/
2  3  5  

[[email protected] ~]# diff test1 test2
diff test1/2 test2/2
2c2
< oranges
---
> 
4a5
> grapefruits
Only in test2: 5
Only in test1: 6
#第二行改变为oranges就会与右边相同。
#第四行之后加入grapefruits就会与右边第五行相同。
[[email protected] ~]# diff -N test1 test2
diff -N test1/2 test2/2
2c2
< oranges
---
> 
4a5
> grapefruits
           

3.1.2 diff补丁用法

diff 命令的输出被保存在一种叫做“补丁”的文件中

  • 使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
diff -urN old/ new/ > mysoft.patch
参数 -u 表示使用 unified 格式,-r 表示比较目录,-N表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中。
           

patch 复制在其他文件中进行的改变(要谨慎使用)

适用- b选项来自动备份改变了的文件

$diff -u foo.conf foo2.conf > foo.patch

$patch -b foo.conf foo.patch

在第一个命令中加上-u选项主要是为了形成一个foo.conf与foo2.conf 存在区别的文件, 将这个内容导入foo.patch,通过第二个命令是直接通过补丁文件直接将原来的文件备份一份之后,生成新内容将原来的内容覆盖掉。生成新的foo.conf 就是第一条命令中的foo2.conf

diff命令参考链接:https://www.cnblogs.com/wangqiguo/p/5793448.html#_label2

3.1.3 ed编辑器

是单行纯文本编辑器,它有命令模式(command mode)和输入模式(input mode)两种工作模式。ed命令支持多个内置命令。
a:切换到输入模式,在文件的最后一行之后输入新的内容;
c:切换到输入模式,用输入的内容替换掉最后一行的内容;
i:切换到输入模式,在当前行之前加入一个新的空行来输入内容;
. : 由输入模式切换至命令模式
d:用于删除最后一行文本内容;
n:用于显示最后一行的行号和内容;
w:<文件名>:一给定的文件名保存当前正在编辑的文件;
q:退出ed编辑器。
           

使用说明

[[email protected] ~]# cat 1
11
888
999
55
55
11
wq
[[email protected] ~]# ed 1
23  #输入ed 1之后会直接显示文件中所有的字符数
2  # 输入行号, 会显示第二行中的内容
888
     # 输入回车之后会默认显示下一行内容
2,3c  # 修改2,3行内容
88
99
5     # 当输入完2,3行之后,会直接添加在3行之后
.   # 退回到命令行模式
wq
23   # 退出时,会自动显示文件中所有的字符数
[[email protected] ~]# cat 1
11
88
99
5
55
55
11
wq
[[email protected] ~]# ed 1
23
2i   #在文件中第二行添加内容,原来的第二行变成第三行
2
.
wq
25
[[email protected] ~]# cat 1
11
2
88
99
5
55
55
11
wq
[[email protected] ~]# ed 1
25
d   # 在命令行模式中删除最后一行

w
22
q
[[email protected] ~]# cat 1
11
2
88
99
5
55
55
11


           

3.2 patch

patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。1
  • 语法:
    • patch [options] [originalfile [patchfile]]

    • patch -pnum <patchfile

  • OPTIONS
    • -R : 假设修补数据是由新旧文件交换位置而产生。
    • -E : 若修补过后输出的文件其内容是一片空白,则移除该文件。
    • -b : 在打补丁过程中,生成一个.orig的备份文件
    • -pnum : num表示忽略目录的层级数目,
/1/2/3/4:假设在/下生成的补丁文件,打补丁时,用户如果在/下,则为-p0 ,如果在/1目录下则忽略一级目录,此时运行命令时为-p1

使用示例:

[[email protected] ~]# diff -aurN test1 test2
[[email protected] ~]# patch -p0 < fix.patch   #运行这个命令会直接将目录test1中的文件设置成与test2中文件一样,如果再次运行,目录test1则会恢复成原样。
[[email protected] ~]# patch -RE -p0  < fix.patch # 或者直接运行这个命令可以将已经打补丁的目录或文件恢复成原样。
$patch -b foo.conf foo.patch  #如果是文件可以直接运行这个命令保证补丁打成功,而且会自动生成备份文件。



           
  1. Linux patch命令 ↩︎

继续阅读