Linux 文本操作

257 阅读4分钟

正文,即字符串 or 纯文本文件的内容。本文讨论 Linux 下正文文本有关的操作。

正文浏览

cat:浏览正文文件内容

$ cat [options] [files]
    -A:显示内容,包括不可见的特殊字符
    -s:将两个及以上的空行省略为一个空行
    -b:加入行号
$ cat > filename
    创建新文本文件,写入内容
    空行{Ctr+d},保存退出        # {Ctr+c}:强行终止
            [注意]:用cat打开二进制文件会造成终端停止工作,可开启一个新的终端以解决。

⚠️ 注意:用 cat 打开二进制文件可能会造成终端停止工作,可开启一个新的终端以解决。

head:浏览文件头几行

$ head [-n x] file
    浏览文件头x行
    若省去[-n x]则显示头10

tail:浏览文件后几行

$ tail file
    浏览文件后10行
$ tail -[n]x  file
    显示从末尾算起的x行
    有无n都一样
$ tail +[n]x  file
    显示从文件第x行之后的内容
    有无n都一样
$tail -f file
    “-f“ == ”--follow“
    当一个正文文件内容发生变化时,把变化显示出来
    {ctrl+c}退出
# tail -f /var/log/messages
    监视日志

wc:(word count)字数统计

$ wc [-options] file
    显示文件 行、单词、字符 数
        无选项依次显示l,w,c
        -l:行数
        -w:单词数
        -c:字符数

more [file]:可翻页地浏览文件

在 more 中键入:

  • {空格}:下一页

  • {Enter}:移动一行

  • {b}:上一页

  • {h}:帮助

  • {/str}:向前搜索str

  • {n}:发现这个字符串的下一次出现

  • {q}:退出 more

  • {v}:在当前行启动 vi

还有一个 lessmore 类似,也可以翻页阅读。(less 好像比 more 更新,这个名字取自 less is more 嘛,但我用惯了 more)

正文文本操作

tr:字符转换

$ tr 'A-Z' 'a-z' < w.txt > u.txt        # 将w中的大写->小写,放入u中
$ tr -d "\r" < dept.data > dept.data.unix        # 将DOS格式的正文文件(以回车“\r”符和换行“\n”符结束一行)转换成Linux格式的文件(只用换行符“\n”来结束一行)

cut:从文件中剪出一个字段(列)至 1 (stdout)

$ cut [options] [file]
        -f:说明(定义)字段(列)
        -c:要剪切的字符:
                「-c4-7」:剪下每行47的字符
        -d:说明(定义)字段的分隔符(默认为Tab)
                「-d,」:以“,”为分隔符
$ cut -f2 emp.data
        显示emp.data中的第二列至stdout

paste:粘贴

$ paste  -d,  name.txt  score.txt  >  student.txt
         -d:说明(定义)字段的分隔符(默认为Tab)
                「-d,」:以“,”为分隔符
          > :横向合并文件:
            |Mike|         |99|          |Mike,99|
            |Jake|    +    |98|    ->    |Jake,98|
            |Anny|         |97|          |Anny,97|

uniq:去掉文件中相邻的重复行

$ uniq [opts] [file]
        -c:在显示的行前冠以该行出现的次数
        -d:只显示重复行
        -i:忽略字符的大小写
        -u:只显示唯一的行

sort:排序

$ sort [opt] [file]
         -r:反向排序
         -f:忽略大小写
         -n:按数字顺序排序
          -u:去掉重复行
          -t c:以字符c为分割符
          -k N1,[N2]:按N1->N2字段排序

col: Tab转空格:

$ col -x < e.tabs >e.spaces
        将 e.tabs 中的 Tab 字符(^I)化为空格存在 e.spaces

正文处理

unix2dos, dos2unix:Unix 与 DOS 正文转化

UNIX 系统的正文(纯文字)格式中只用换行符\n作为行结束符;

DOS & Windows 系统的正文中是以回车符 \r 和换行符 \n 作为行结束符;

cat -A filename 可见二者区别。

将 DOS 格式的文件转换成 UNIX 格式的文件用 dos2unix file_name

将 UNIX 格式的文件转换成 DOS 格式的文件用 unix2dos file_name

diff, sdiff:比较两个文件的差别

diff file_1 file_2:只输出两者不同点

显示结果中:

  • c 为比较,比较某行二者不同点;
  • d 是不同,显示一文无一文有的;
  • < 表示第1个文件中的数据行。
  • > 表示第2个文件中的数据行。
$ diff letters.upper letters
2c2        # 第1个文件的第2行与第2个文件的第2行比较。
< B        # 第1个文件的第2行为B。
---
> b        # 第2个文件的第2行为b。
6c6        # 第1个文件的第6行与第2个文件的第6行比较。
< F        # 第1个文件的第6行为F。
---
> f        # 第2个文件的第6行为f。
8d7        # 第1个文件一共有8行,而第2个文件一共有7行。
< H        # 第1个文件的第8行(也是最后一行)为H。

sdiff file_1 file_2:side-by-side 输出两者所有行,标示不同

显示结果中:

  • | 左侧表示第1个文件中的数据行。

  • | 右侧表示第2个文件中的数据行。

  • < 表示第1个文件中的数据行(当第1个文件中有数据,但第2个文件中没有时)。

  • > 表示第2个文件中的数据行(当第2个文件中有数据,但第1个文件中没有时)。

$ sdiff letters.upper letters
A                             A
B                            | b            # 第1个文件中为B,第2个文件中为b。
C                             C 
D                             D
E                             E
F                            | f            # 第1个文件中为F,第2个文件中为f。
G                             G
H                             <            # 第1个文件中为H,第2个文件中的这一行为空。

sdiff 命令的显示结果更容易阅读。 但是如果比较的两个文件很大,而其中的差别又很少,使用 diff 命令可能更好些。

aspell, look:检查单词的拼写

  • aspell 是Linux系统上的一个交互式的英语拼写检查程序,该程序通过一个简单的菜单驱动的界面来提供改正英文单词的建议。
$ aspell check file_name
        Enter后,
        光标停留在第1个有拼写错误的单词上,
        并在终端窗口下部给出一些可供选择的正确单词;
        输入某个单词前面的编号来选择这个单词,
        系统就会立即修改光标所在处的单词;
        之后光标将移到下一个有拼写错误的单词。
$ aspell list < file_name
            以非交互的方式在终端窗口中列出某个文件中的全部有拼法错误的英语单词

look sth:列出所有以 sth 开头的英语单词以供选择。

$ look progra
prograde
program
......

注:aspell,look 使用的字典是 /usr/share/dict/words

expand, fmt, pr: 重新格式化正文

expand:将Tab化为空格

$ expand [-t 1] data.tab > data.spaces
        -t n:表示将制表键转换成n个空格符。

fmt: 格式化文本

$ fmt -u -w48 news > news.fmt
        fmt将它的输入格式化成一些段落,
        其中段落宽度是使用-wn选项来定义的(w为width,n为字符的数目,系统默认宽度为75个字符)。
        利用-u选项将文件中的空格统一化(每个单词之间使用一个空格分隔,每个句子之间使用两个空格分隔)。
            
        fmt命令将它的输入中的空行当作段落分隔符看待。

pr:按照打印机的格式重新编排纯文本文件中的内容

$ pr file
        pr命令的默认输出为每页66行,其中56行为正文内容,并包括表头。
        若没有指定列表头(Header),系统默认使用文件名作为列表头,并在每页的页首部分显示。
        另外,每页的页首部分还有页码和时间(inode.M_time)。
$ pr -h"English Dictionary on Linux" -l18 -5 /usr/share/dict/words | more
        -h选项为列表头(Header),
        在h后面使用双引号括起来的就是要显示的表头信息,
        -l选项用来定义每页的行数,-l18表示每页都有18行,
                (-l选项后的数目不能太小,如果太小pr命令会忽略这一选项)
        -5表示每页打印5列。

输出结果:

2006-10-08 02:00           English Dictionary on Linux            Page 1
&c             'prentice      'shun          'tis          'un
'd             're            'slid          'twas         've
......
2006-10-08 02:00           English Dictionary on Linux            Page 2
-acal          -acy          -age          -ana           -ar
-acea          -ad           -agogue       -ance          -arch
--More--