Linux ❉ 文本处理

一 cat命令:连接文件并打印输出到标准输出设备

1 介绍

        cat 命令可以用来显示文本文件的内容(类似于 DOS 下的 type 命令),也可以把几个文件内容附加到另一个文件中,即连接合并文件。cat 是 concatenate(连接、连续)的简写。

2 命令格式

# 显示文件的内容
[root@localhost ~]# cat [选项] 文件名
-A	相当于 -vET 选项的整合,用于列出所有隐藏符号(包括回车符($)、Tab 键(^I)等。);
-E	列出每行结尾的回车符 $;
-n	对输出的所有行进行编号;
-b	同 -n 不同,此选项表示只对非空行进行编号。
-T	把 Tab 键 ^I 显示出来;
-V	列出特殊字符;
-s	当遇到有连续 2 行以上的空白行时,就替换为 1 行的空白行

# 连接合并文件
[root@localhost ~]# cat 文件1 文件2 > 文件3

        cat 命令用于查看文件内容时,不论文件内容有多少,都会一次性显示。如果文件非常大,那么文件开头的内容就看不到了。不过 Linux 可以使用PgUp+上箭头组合键向上翻页,但是这种翻页是有极限的,如果文件足够长,那么还是无法看全文件的内容。因此,cat 命令适合查看不太大的文件。

(1)隐藏符号

        不同操作系统,文本文件的行尾符是有区别的,Unix每行结尾为"\n",Windows系统每行结尾是“\r\n”, Mac OS在 OS X以前每行结尾是"\r", 现在每行结尾是 "\n".在不同平台间文本文件转换有三个方式:

# 编辑器实现转换。
NotePad++/Ultra Edit/Sublime Text2提供了转换功能。
# 用Linux命令实现转换。
# Windows到Unix       
sed -e 's/.$//' mydos.txt > myunix.txt
# Unix到Windows       
$ sed -e 's/$/\r/' myunix.txt > mydos.txt
# 用Linux命令实现转换。  
unix2dos filename 
dos2unix filename

如果有的时候文件执行有问题,不妨用-A参数探查一下

二 more命令:分屏显示文件内容

1 介绍

        more 命令可以分页显示文本文件的内容,使用者可以逐页阅读文件中内容

2 命令格式

[root@localhost ~]# more [选项] 文件名
##我们一般不用什么选项
-f	计算行数时,以实际的行数,而不是自动换行过后的行数。
-p	不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。
-c	跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。
-s	当遇到有连续两行以上的空白行时,就替换为一行的空白行。
-u	不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。
+n	从第 n 行开始显示文件内容,n 代表数字。
-n	一次显示的行数,n 代表数字。

more 命令的执行会打开一个交互界面,因此有必要了解一些交互命令

交互指令功能
h 或 ?显示 more 命令交互命令帮助。
q 或 Q退出 more。
v在当前行启动一个编辑器。
:f显示当前文件的文件名和行号。
!<命令> 或 :!<命令>在子Shell中执行指定命令。
回车键向下移动一行。
空格键向下移动一页。
Ctrl+l刷新屏幕。
=显示当前行的行号。
'转到上一次搜索开始的地方。
Ctrf+f向下滚动一页。
.重复上次输入的命令。
/ 字符串搜索指定的字符串。
d向下移动半页。
b向上移动一页。

三 less命令:查看文件内容(重要)

1 介绍

        less 命令的作用和 more 十分类似,都用来浏览文本文件中的内容,不同之处在于,使用 more 命令浏览文件内容时,只能不断向后翻看,而使用 less 命令浏览,既可以向后翻看,也可以向前翻看。

不仅如此,为了方面用户浏览文本内容,less 命令还提供了以下几个功能:

  • 使用光标键可以在文本文件中前后(左后)滚屏;
  • 用行号或百分比作为书签浏览文件;
  • 提供更加友好的检索、高亮显示等操作;
  • 兼容常用的字处理程序(如 Vim、Emacs)的键盘操作;
  • 阅读到文件结束时,less 命令不会退出;
  • 屏幕底部的信息提示更容易控制使用,而且提供了更多的信息。

2 命令格式

[root@localhost ~]# less [选项] 文件名
-N	显示每行的行号。
-S	行过长时将超出部分舍弃。
-e	当文件显示结束后,自动离开。
-g	只标志最后搜索到的关键同。
-Q	不使用警告音。
-i	忽略搜索时的大小写。
-m	显示类似 more 命令的百分比。
-f	强迫打开特殊文件,比如外围设备代号、目录和二进制文件。
-s	显示连续空行为一行。
-b <缓冲区大小>	设置缓冲区的大小。
-o <文件名>	将 less 输出的内容保存到指定文件中。
-x <数字>	将【Tab】键显示为规定的数字空格。

        在使用 less 命令查看文件内容的过程中,和 more 命令一样,也会进入交互界面,因此需要掌握一些常用的交互指令,less 在屏幕底部显示一个冒号(:),等待用户输入命令,比如说,用户想向下翻一页,可以按空格键;如果想向上翻一页,可以按 b 键。

交互指令功能
/字符串向下搜索“字符串”的功能。
?字符串向上搜索“字符串”的功能。
n重复*前一个搜索(与 / 成 ? 有关)。
N反向重复前一个搜索(与 / 或 ? 有关)。
b向上移动一页。
d向下移动半页。
h 或 H显示帮助界面。
q 或 Q退出 less 命令。
y向上移动一行。
空格键向下移动一页。
回车键向下移动一行。
【PgDn】键向下移动一页。
【PgUp】键向上移动一页。
Ctrl+f向下移动一页。
Ctrl+b向上移动一页。
Ctrl+d向下移动一页。
Ctrl+u向上移动半页。
j向下移动一行。
k向上移动一行。
G移动至最后一行。
g移动到第一行。
ZZ退出 less 命令。
v使用配置的编辑器编辑当前文件。
[移动到本文档的上一个节点。
]移动到本文档的下一个节点。
p移动到同级的上一个节点。
u向上移动半页。

四 head命令:显示文件开头的内容

1 介绍

        head 命令可以显示指定文件前若干行的文件内容

2 命令格式

[root@localhost ~]# head [选项] 文件名
-n K	这里的 K 表示行数,该选项用来显示文件前 K 行的内容;如果使用 "-K" 作为参数,则表示除了文件最后 K 行外,显示剩余的全部内容。
-c K	这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容;如果使用 "-K",则表示除了文件最后 K 字节的内容,显示剩余全部内容。
-v	显示文件名;
!!如不设置显示的具体行数,则默认显示 10 行的文本数据

3 示例

# 基本用法。
[root@localhost ~]# head anaconda-ks.cfg

# head 命令默认显示文件的开头 10 行内容。如果想显示指定的行数,则只需使用 "-n" 选项即可
[root@localhost ~]# head -n 20 anaconda-ks.cfg

# 这是显示文件的开头 20 行内容,也可以直接写 "-行数"
[root@localhost ~]# head -20 anaconda-ks.cfg

五 tail命令:显示文件结尾的内容

1 介绍

        tail 命令和 head 命令正好相反,它用来查看文件末尾的数据。

2 命令格式

[root@localhost ~]# tail [选项] 文件名
-n K	这里的 K 指的是行数,该选项表示输出最后 K 行,在此基础上,如果使用 -n +K,则表示从文件的第 K 行开始输出。
-c K	这里的 K 指的是字节数,该选项表示输出文件最后 K 个字节的内容,在此基础上,使用 -c +K 则表示从文件第 K 个字节开始输出。
-f	输出文件变化后新增加的数据。
!!使用 tail -n 3 /etc/passwd 命令和 tail -3 /etc/passwd 的效果是一样的

3 示例

(1)简单查看

【例 1】查看 /etc/passwd 文件最后 3 行的数据内容。
[root@localhost ~]# tail -n 3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

# 除此之外,还可以采用如下这种形式:
[root@localhost ~]# tail -3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

# 可以看到,使用 tail -n 3 /etc/passwd 命令和 tail -3 /etc/passwd 的效果是一样的。

【例 2】查看 /etc/passwd 文件末尾 100 个字节的数据内容。
[root@localhost ~]# tail -c 100 /etc/passwd
cpdump:x:72:72::/:/sbin/nologin

(2)监听文件的新増内容

        可以使用 "-f" 选项来监听文件的新増内容,光标不会退出文件,而会一直监听在文件的结尾处

[root@localhost ~]#tail -f kubernetes.log

        这条命令会显示文件的最后 10 行内容,而且光标不会退出命令,每隔一秒会检查一下文件是否增加新的内容,如果增加就追加到原来的输出结果后面并显示。因此,这时如果向文件中追加一些数据,正在监听的终端中,会看到这些信息。如果想终止输出,按【Ctrl+c】键中断 tail 命令即可

六 grep命令详解:查找文件内容

1 介绍

        grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的模式(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输出(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,而这也就是 grep 命令的全称。

        grep命令能够在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子。

        正则表达式是描述一组字符串的一个模式,正则表达式的构成模仿了数学表达式,通过使用操作符将较小的表达式组合成一个新的表达式。正则表达式可以是一些纯文本文字,也可以是用来产生模式的一些特殊字符。为了进一步定义一个搜索模式,grep 命令支持如表 1 所示的这几种正则表达式的元字符(也就是通配符)。
正则表达式详细释义见此icon-default.png?t=LBL2https://blog.csdn.net/wangjie72270/article/details/122477474        需要注意的是,在基本正则表达式中,如通配符 *、+、{、|、( 和 )等,已经失去了它们原本的含义,而若要恢复它们原本的含义,则要在之前添加反斜杠 \,如 \*、\+、\{、\|、\( 和 \)。

        grep 命令是用来在每一个文件或中(或特定输出上)搜索特定的模式,当使用 grep 时,包含指定字符模式的每一行内容,都会被打印(显示)到屏幕上,但是使用 grep 命令并不改变文件中的内容。

2 命令格式

[root@localhost ~]# grep [选项] 模式 文件名
-a   --text   #不要忽略二进制的数据。
-A<显示行数>   --after-context=<显示行数>   #除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b   --byte-offset   #在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数>   --before-context=<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前的内容。
-c    --count   #计算符合样式的列数。
-C<显示行数>    --context=<显示行数>或-<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作>      --directories=<动作>   #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>  --regexp=<范本样式>   #指定字符串做为查找文件内容的样式。
-E      --extended-regexp   #将样式为延伸的普通表示法来使用。
-f<规则文件>  --file=<规则文件>   #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F   --fixed-regexp   #将样式视为固定字符串的列表。
-G   --basic-regexp   #将样式视为普通的表示法来使用。
-h   --no-filename   #在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H   --with-filename   #在显示符合样式的那一行之前,表示该行所属的文件名称。
-i    --ignore-case   #忽略字符大小写的差别。
-l    --file-with-matches   #列出文件内容符合指定的样式的文件名称。
-L   --files-without-match   #列出文件内容不符合指定的样式的文件名称。
-n   --line-number   #在显示符合样式的那一行之前,标示出该行的列数编号。
-q   --quiet或--silent   #不显示任何信息。
-r   --recursive   #此参数的效果和指定“-d recurse”参数相同。
-s   --no-messages   #不显示错误信息。
-v   --revert-match   #显示不包含匹配文本的所有行。
-V   --version   #显示版本信息。
-w   --word-regexp   #只显示全字符合的列。
-x    --line-regexp   #只显示全列符合的列。
-y   #此参数的效果和指定“-i”参数相同。

如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;

而如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行

3 示例

# 假设有一份 emp.data 员工清单,现在要搜索此文件,找出职位为 CLERK 的所有员工
[root@localhost ~]# grep CLERK emp.data

# 而在此基础上,如果只想知道职位为 CLERK 的员工的人数,可以使用“-c”选项
[root@localhost ~]# grep -c CLERK emp.data

# 搜索 emp.data 文件,使用正则表达式找出以 78 开头的数据行
[root@localhost ~]# grep ^78 emp.data

七 输入输出重定向

        Linux 中标准的输入设备默认指的是键盘,标准的输出设备默认指的是显示器。而本节所要介绍的输入、输出重定向,完全可以从字面意思去理解,也就是:

  • 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
  • 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

        通常是用文件或命令的执行结果来代替键盘作为新的输入设备,而新的输出设备通常指的就是文件。

1 输入重定向

(1)命令格式

命令符号格式作用
命令 < 文件将指定文件作为命令的输入设备
命令 << 分界符表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
命令 < 文件 1 > 文件 2将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中。

        默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台。

(2)示例

【例 1】
# 以 /etc/passwd 文件(存储了系统中所有用户的基本信息)为例,执行如下命令:
[root@localhost ~]# cat /etc/passwd
# 这里省略输出信息
[root@localhost ~]# cat < /etc/passwd
# 输出结果同上面命令相同

# 注意,虽然执行结果相同,但第一行代表是以键盘作为输入设备,而第二行代码是以 /etc/passwd 文件作为输入设备。

【例 2】
[root@localhost ~]# cat << 0
>c.biancheng.net
>Linux
>0
c.biancheng.net
Linux

# 可以看到,当指定了 0 作为分界符之后,只要不输入 0,就可以一直输入数据。

【例 3】
# 首先,新建文本文件 a.tx,然后执行如下命令:
[root@localhost ~]# cat a.txt
[root@localhost ~]# cat < /etc/passwd > a.txt
[root@localhost ~]# cat a.txt
# 输出了和 /etc/passwd 文件内容相同的数据

# 可以看到,通过重定向 /etc/passwd 作为输入设备,并输出重定向到 a.txt,最终实现了将 /etc/passwd 文件中内容复制到 a.txt 中。

2 输出重定向

(1) 介绍

        相较于输入重定向,我们使用输出重定向的频率更高。并且,和输入重定向不同的是,输出重定向还可以细分为标准输出重定向和错误输出重定向两种技术。

        例如,使用 ls 命令分别查看两个文件的属性信息,但其中一个文件是不存在的

[root@localhost ~]# touch demo1.txt
[root@localhost ~]# ls -l demo1.txt
-rw-rw-r--. 1 root root 0 Oct 12 15:02 demo1.txt
[root@localhost ~]# ls -l demo2.txt    <-- 不存在的文件
ls: cannot access demo2.txt: No such file or directory

        上述命令中,demo1.txt 是存在的,因此正确输出了该文件的一些属性信息,这也是该命令执行的标准输出信息;而 demo2.txt 是不存在的,因此执行 ls 命令之后显示的报错信息,是该命令的错误输出信息。

        再次强调,要想把原本输出到屏幕上的数据转而写入到文件中,这两种输出信息就要区别对待。

        在此基础上,标准输出重定向和错误输出重定向又分别包含清空写入和追加写入两种模式。因此,对于输出重定向来说,其需要用到的符号以及作用如表。

(2)命令格式

命令符号格式作用
命令 > 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
命令 2> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。
命令 >> 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
命令 2>> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。
命令 >> 文件 2>&1
或者
命令 &>> 文件
将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。

(3)示例

# 新建一个包含有 "Linux" 字符串的文本文件 Linux.txt,以及空文本文件 demo.txt
[root@localhost ~]# cat Linux.txt > demo.txt
[root@localhost ~]# cat demo.txt
Linux
[root@localhost ~]# cat Linux.txt > demo.txt
[root@localhost ~]# cat demo.txt
Linux     # 这里的 Linux 是清空原有的 Linux 之后,写入的新的 Linux
[root@localhost ~]# cat Linux.txt >> demo.txt
[root@localhost ~]# cat demo.txt
Linux
Linux     # 以追加的方式,新数据写入到原有数据之后
[root@localhost ~]# cat b.txt > demo.txt
cat: b.txt: No such file or directory  # 错误输出信息依然输出到了显示器中
[root@localhost ~]# cat b.txt 2> demo.txt
[root@localhost ~]# cat demo.txt
cat: b.txt: No such file or directory  # 清空文件,再将错误输出信息写入到该文件中
[root@localhost ~]# cat b.txt 2>> demo.txt
[root@localhost ~]# cat demo.txt
cat: b.txt: No such file or directory
cat: b.txt: No such file or directory  # 追加写入错误输出信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值