Linux 常用文本编辑器

文本编辑器是操作系统基础的功能软件之一。根据使用环境的不同,Linux 的文本编辑器有很多类型。

emacs

emacs 是一款功能强大的编辑器,与其说是一款编辑器,它更像一个操作系统。emacs 带有内置的网络浏览器、IRC 客户端、计算器,甚至是俄罗斯方块。当然,emacs 需要在图形化界面的 Linux 中使用。

优点:

  • 可定制,可扩展;
  • 功能强大;
  • 可以与许多自由软件编程工具集成。

缺点:

  • 入门难度高,对普通用户不友好。

nano

nano 是命令行界面下一个相对简单的文本编辑器,它是为了代替闭源的 Pico 文本编辑器而开发的,1999 年以 GPL 协议发布第一个版本,是一个自由软件,同时也是 GNU 计划的一个组成部分。nano 有很多人性化的功能设计,如语法高亮、正则表达式搜索和替换、平滑滚动、多个缓冲区、自定义快捷键、撤销或重复编辑。

优点:

  • 易于使用,操作简单,适用于简单文本编辑。

缺点:

  • 对复杂的文本编辑比较耗时,无强大的命令功能进行复杂操作,不支持如宏、一次编辑多个文件、窗口分割、垂直块、矩形选择、编辑、自动完成等高级功能。

gedit

gedit 是一个 GNOME 桌面环境下兼容 UTF-8 的文本编辑器。它简单易用,有良好的语法高亮,对中文支持很好,支持包括 GB2312、GBK 在内的多种字符编码。gedit 是一款自由软件。gedit 包含语法高亮和标签编辑多个文件的功能。利用 GNOME VFS 库,它还可以编辑远程文件。它支持完整的恢复和重做系统以及查找和替换。

优点:

  • 图形化界面,易上手,操作习惯与 Windows 类似,包括常用的快捷键如复制粘贴等。

缺点:

  • 需要安装图形化桌面才能使用。

kedit

与 gedit 类似,kedit 是 KDE 图形化桌面中常用的一种文本编辑器。kedit 是一个非常小的编辑器,特别适用于浏览文本和各种配置文件。

优点:

  • 图形化界面,易上手,操作习惯与 Windows 类似,包括常用的快捷键如复制粘贴等。

缺点:

  • 需要安装图形化桌面才能使用。

vi

vi 是标准的 Unix 文本编辑器,也是最古老的文本编辑器、最通用的文本编辑器。所有的 Linux、Unix 都默认带有 vi 文本编辑器。虽然 vi 的操作方式与其他常用的文本编辑器(如 gedit)很不相同,但是由于其运行于字符界面,并可用于所有 unix/linux 环境,目前仍被经常使用。

vi 的三种命令模式:

  • Command:命令模式,用于输入命令;
  • Insert:插入模式,用于插入文本;
  • Visual:可视模式,用于浏览文本。

优点:

  • 通用,几乎所有的 Unix、Linux 都自带 vi。

缺点:

  • 功能简单,显示效果单一。

vim

Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。

Vim 的第一个版本由布莱姆·米勒在 1991 年发布。最初的简称是 Vi IMitation,随着功能的不断增加,正式名称改成了 Vi IMproved。现在是在开放源代码方式下发行的自由软件。

Vim 编辑器中设置了三种模式:命令模式、末行模式和编辑模式。

  • 命令模式:可以控制光标移动,可以对文本进行复制、粘贴、删除等操作。
  • 输入模式:可以进行正常的文本录入。
  • 末行模式:保存或者退出文件以及设置编辑环境。

可以使用快捷键在这三种模式之间切换。

ictstu

使用 vim 编辑器

vim 编辑器的语法:

TERMINALbash
vim [选项] 文件名

选项:

  • -c:打开文件前执行指定的命令。
  • -R:以只读方式打开文件,可以强制保存文件。
  • -M:以只读方式发开文件,不能强制保存文件。
  • +num:从第 num 行开始阅读文件。

模式切换命令:

快捷键作用快捷键作用
【a】在光标所在字符后插入内容。【A】在光标所在行尾插入内容。
【i】在光标所在字符前插入内容。【I】在光标所在行首插入内容。
【o】在光标下插入新行。【O】在光标上插入新行。
【ESC】退出到命令行模式【:】切换到末行模式

命令模式操作

使用 vim 打开文件,如果文件存在会直接打开,如果文件不存在,则会在文件末尾提示[New],并且在第一次保存文件时完成文件创建。打开文件后默认进入到命令模式,可以在该模式下执行一些命令和操作。

移动光标

快捷键作用快捷键作用
【上下左右键】上下左右移动光标【k】、【j】、【h】、【l】上、下、左、右移动光标
【0】移动到行首【g0】移动光标到所在屏幕行首
【gg】移动光标到文件头部【G】移动光标到文件末尾
【$】移动至行尾【^】移动至行首

数据操作

快捷键作用快捷键作用
【dd】删除(剪切)光标所在行【yy】或【Y】复制光标所在行
【5dd】删除(剪切)光标所在行开始的 5 行【5yy】复制光标所在行开始的 5 行
【u】撤销上一步操作【p】/【P】粘贴复制或剪切的内容到光标后面/前面

末行模式操作

在命令模式按【:】键,可以切换到末行模式,在末行模式可以执行一些指令。

保存与退出

操作作用操作作用
保存
不保存退出
保存并退出
!
强制保存并退出
【ZZ】保存并退出
!
强制退出不保存

行号显示与取消

设置行号::set nu,取消行号::set nonu。

查找与替换

操作作用操作作用
/old/new/
将光标所在行的第一个 old 替换为 new。
/old/new/g
将光标所在行的所有 old 替换为 new。
,5s/old/new/g
将 1~5 行中所有的 old 替换为 new。:%s/old/new/g将全文的所有 old 替换为 new。
/old/new/gi
将全文的所有 old 替换为 new,不区分大小写。?字符串在文本中从下至上搜索字符串。
/字符串在文本中从上至下搜索字符串。【n】/【N】向前/向后搜索关键字符串。
,n 为数字
跳转至 n 行。
执行该命令

操作示例

vim 自带了一个交互式的教程,里面包含了最基础的信息,可以通过执行vimtutor命令打开教程。

TERMINALbash
[root@ictstu ~]# vimtutor

ictstu

编辑一份笔记

使用 vim 命令打开一个名为 ictstunote.txt 的文件。

TERMINALbash
[root@ictstu ~]# vim ictstunote.txt

ictstu

文件如果不存在,文件末尾则会显示[New]。

ictstu

此时输入内容是没有反应的,需要按下【a】、【i】、【o】中的任意一个按键,切换到输入模式,按完以后底部提示字样会切换为”—INSERT—”。

ictstu

此时可以向文件内随意输入内容。

ictstu

如果需要保存内容,则需要先按下【ESC】键切换到命令行模式再按下【:】键,切换到末行模式,并输入:wq,保存文件并退出。

ictstu

ictstu

文本处理

查看文件

查看文件可以使用之前学到的 cat、head、tail、more、less 等命令完成。

stat

stat 命令用户查看文件的具体存储细节和时间等信息。

语法:

TERMINALbash
stat 文件

示例:

① 查看 passwd 文件的信息。

TERMINALbash
[root@ictstu ~]# stat passwd

ictstu

提取列或字段

1. awk

awk 是一个强大的文本分析工具,简单来说 awk 就是把文件或者标准输入逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。命令的名字来源于 Alfred Aho、Peter Weinberger、Brian Kernighan 三位创始人的姓氏缩写。

语法:

TERMINALbash
awk [选项] 文件名

选项:

  • -F 字符串:指定以字符串作为输入行的分隔符,默认使用空格或制表符作为分隔符。

示例:

① 提取 passwd 文件的第一列数据。

TERMINALbash
[root@ictstu ~]# awk -F ":" '{print $1}' passwd

ictstu

② 提取 passwd 文件第一和第三列的数据。

TERMINALbash
[root@ictstu ~]# awk -F ":" '{print $1,$3}' passwd

ictstu

③ 提取 passwd 文件中前三个字符。

TERMINALbash
[root@ictstu ~]# awk '{print substr($0, 1, 3)}' passwd

ictstu

2. cut

cut 命令用于按列提取文件内容。

语法:

TERMINALbash
cut [选项] 文件名

选项:

  • -d:设置分隔符。
  • -c:以字符为单位进行分割。
  • -f:显示指定字段的内容。

示例:

① 提取 passwd 文件的第一列数据。

TERMINALbash
[root@ictstu ~]# cut -d ":" -f 1 passwd

ictstu

② 提取 passwd 文件第一和第三列的数据。

TERMINALbash
[root@ictstu ~]# cut -d ":" -f 1,3 passwd

ictstu

③ 提取 passwd 文件中前三个字符。

TERMINALbash
[root@ictstu ~]# cut -c 1-3 passwd

ictstu

提取关键字

grep

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

语法:

TERMINALbash
grep [选项] 文件

选项:

  • -c:统计符合样式的行数。
  • -i:忽略大小写。

示例:

① 查找 passwd 文件中包含 root 字符串的行。

TERMINALbash
[root@ictstu ~]# grep root passwd

ictstu

② 查找 passwd 文件中包含 user 字符串的行,不区分大小写。

TERMINALbash
[root@ictstu ~]# grep -i user passwd

ictstu

③ 统计 passwd 文件中包含 user 字符串的行有多少行,不区分大小写。

TERMINALbash
[root@ictstu ~]# grep -c -i user passwd

ictstu

文本统计

wc

wc 命令用于计算字数。利用 wc 指令可以计算文件的字节数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则 wc 指令会从标准输入设备读取数据。

语法:

TERMINALbash
wc [选项] 文件

选项:

  • -c:只显示字节数。
  • -l:只显示行数。
  • -w:只显示字数。

示例:

① 统计 passwd 文件中的单词数量。

TERMINALbash
[root@ictstu ~]# wc -w passwd

ictstu

② 统计 passwd 文件的字节数。

TERMINALbash
[root@ictstu ~]# wc -c passwd

ictstu

③ 统计 passwd 文件的行数。

TERMINALbash
[root@ictstu ~]# wc -l passwd

ictstu

文本排序

sort

sort 命令可以将文件进行排序,并将排序结果标准输出。sort 命令既可以从特定的文件,也可以从 stdin 中获取输入。

语法:

TERMINALbash
sort [选项] 文件

选项:

  • -b:忽略每行前面开始的空格字符。
  • -c:检查文件是否已经按照顺序排序。
  • -d:排序时,处理英文字母、数字及空格字符外,忽略其他字符。
  • -f:排序时,将小写字母视为大写字母。
  • -n:依照数值的大小排序。
  • -r:以相反的顺序排序。
  • -o <文件>:将排序后的结果存入指定的文件。
  • -u:忽略相同行。

示例:

① 按照字母顺序对 passwd 文件内容进行排序。

TERMINALbash
[root@ictstu ~]# sort passwd

ictstu

② 以冒号(:)为间隔符,对 passwd 文件内容按照数字大小对第 3 列进行排序。

TERMINALbash
[root@ictstu ~]# sort -t : -k 3 -n passwd

ictstu

文本比较

diff

diff 命令以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

语法:

TERMINALbash
diff [选项] 文件1 文件2

选项:

  • -B:不检查空白行。
  • -c:显示全部内文,并标出不同之处。
  • -i:忽略大小写的不同。
  • -r:比较子目录中的文件。
  • -w:忽略全部的空格字符。

示例:

① 比较 passwd 文件和 password 文件的内容有何不同。

TERMINALbash
[root@ictstu ~]# diff passwd password

ictstu

文本操作

1. tr

tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备,常用于转换或删除文件中的字符。

语法:

TERMINALbash
tr [选项] 字符串1 字符串2

选项:

  • -c:反选设定字符,也就是符合 set1 的部分不做处理,不符合的剩余部分才进行转换。
  • -d:删除字符。
  • -s 缩减连续重复的字符成指定的单个字符。

示例:

① 将 passwd 文件中的小写全部替换为大写并输出到终端。

TERMINALbash
[root@ictstu ~]# tr [a-z] [A-Z] < passwd

ictstu

2. sed

相比较 tr,sed 可以修改字符串。sed 是一种在线编辑器,可以对来自文件、以及标准输入的文本进行编辑。执行时,sed 会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕。所以 sed 命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i 选项或者将结果重定向到新的文件中。

语法:

TERMINALbash
sed [选项] 文件名

选项:

  • -n:取消默认输出。
  • -e:多点编辑,可以执行多个子命令。
  • -f:从脚本文件中读取命令。
  • -i:直接编辑原文件。
  • -l:指定行的长度。
  • -r:在脚本中使用扩展表达式

示例:

① 将 passwd 文件中的 root 替换为大写的 ROOT。

TERMINALbash
[root@ictstu ~]# sed 's/root/ROOT/g' passwd

ictstu

② 读取 passwd 文件的第 5~8 行。

TERMINALbash
[root@ictstu ~]# sed -n '5,8p' passwd

ictstu

3. uniq

uniq 命令用于去除文件中连续的重复行。

语法:

TERMINALbash
uniq 文件

示例:

① 去除 password 文件中的重复行。

TERMINALbash
[root@ictstu ~]# uniq password

ictstu

4. dd

dd 命令用于按照指定大小和个数来复制文件或转换文件。

语法:

TERMINALbash
dd if=参数值 of=参数值 count=参数值 bs=参数值

说明:

  • if:输入的文件名称。
  • of:输出的文件名称。
  • count:要复制”块”的个数。
  • bs:要复制”块”的大小。

示例:

① 生成一个大小为 500MB 的新文件 news。

TERMINALbash
[root@ictstu ~]# dd if=/dev/zero of=news count=1 bs=500M

ictstu

② 复制 passwd 文件的前 100 个字节到 news1。

TERMINALbash
[root@ictstu ~]# dd if=passwd of=news1 count=1 bs=100

ictstu

本文至此结束。
备注