一、文本提取工具
查看文本的全部内容
cat 将一个文件的全部内容打印到标准输出
cat 将多个文件合并成一个文件
cat 123.txt config.txt > new.txt
cat 还可以查看文件的特殊字符
cat -A 文件名 可以查看肉眼不可见的字符(比如空格)
more / less 分页查看文件(也就是每一次只显示一页)
more 就只是一个查看文本的工具,而 less 它还可以编辑文件
less 可以进入到 vim 编辑器通过 v 键直接切换到 vim 编辑文件
二、选取文本内容
head 来选择文本开头指定的行
head passwd 查看文本的前十行内容
head -n 15 或者 head -15 查看文本开头的前十五行
head -n +15 查看文本开头的十五行,head -n 15 除了文本末尾的 15 行之外显示所有的行(也就是去掉文本末尾的 15 行)
tail 来选择文本末尾指定的行
tail passwd 查看文本末尾的后十行
tail -n 15 或者 tail -15 都表示查看文本的后十五行内容
tail -n +15 查看从文本的十五行开始一直到文本的结尾
tail -f 实时查看文件的内容变化(监控文件)
tail -f /var/log/message 通常用来查看日志文件
过滤 /opt/passwd 文件的15 - 20 行
head 取最大值
tail 取最大行 - 最小行 + 1
三、通过关键字来过滤文本
grep 通过关键字来过滤文本内容
grep 的过滤以行为单位,只要这一行中包含关键字,则 grep 选取这一行,而不是单独选中这一个关键字
grep root /etc/passwd 在 passwd 文件中过滤包含 root 内容的行
支持的常用选项:
-i: 忽略关键字的大小写
-n: 显示关键字出现的行号
-o: 仅显示查找到的关键字
-c: 显示包含关键的行数
-v: 对关键字取反,也就是除了该关键字之外的所有行
-q: grep 的静默模式,也就是不在屏幕上输出内容
-Ax: 显示过滤关键字的后 x 行内容
-Bx:显示过滤关键字的前 x 行内容
-Cx:显示过滤关键字的前后 x 行内容
-r: 根据关键字的内容找文件,搜索文件
-l: 仅列出根据关键字查找到的文件路径,而不显示文本的内容,通常和 -r 连用
--color=auto 给过滤的关键字显示高亮的颜色,在 RHEL 中已经默认设置
四、使用正则表达式实现特殊过滤
在 passwd 文件中过滤 root 用户,以 root 作为关键字,仅过滤 root 用户
root:x:0:0:root:/root:/bin/bash 需要的内容
operator:x:11:0:operator:/root:/sbin/nologin 需要去掉的内容
找规律,如何通过 root 只找到第一行
^ 元字符 就是用来充当正则表达式的"规律"
在 IT 中进行字符处理,是离不开正则的
字符的意义:
基本的正则:
grep
^ 以某某开头的行
$ 以某某结尾的行
\< 在字(单词)的开始进行匹配
单词 由字母数字和下划线组成
\> 在字(单词)的结尾进行匹配
\<test\> 过滤一整个单词
. 任意的单个字符
[abc] 匹配 abc 中的任意一个字符
[^abc] 匹配 abc 中字符以外的任意字符
[a-z] 匹配 a-z 之间的任意单个字符也可以是 [0-9]
\ 反斜杆 转义字符(转义字符是为了抑制住字符的特殊意义)
\ 除了在正则表达式中进行转义以外,在 Linux 的 shell 命令行也表示转义
' \. ' 表示在 Linux 命令行去掉了特殊意义 变成 \.
\. 在 grep 中使用 \ 去掉点的意义,所以此时点就变成普通字符
* 表示对前一项进行 0 次或者多次重复匹配
.* 表示匹配任意字符的多个字符
扩展的正则:
grep -E 或者是 egrep
+ 表示对前一项进行 1次 或者 多次重复 匹配
? 表示对前一项进行 0次 或者 1次重复 匹配
{j} 表示对前一项进行 j次 重复(明确指定)
{n,} 表示对前一项至少进行 n次 重复
{,m} 表示对后一项最多进行 m次 重复
{n,m} 表示对前一项进行最少 n次 最多 m次 重复匹配
s|t 表示匹配 s 或者是 t 同时过滤多个关键字
() 表示将前一项作为单项处理(所谓的单项就是将关键字作为一个整体)
五、以列位单位提取字符
grep 以行为单位 cut 以列为单位
cut
cut:
-d 用来指定 cut 的分隔符 通常使用制表符作为分隔符
-f 用来打印指定的列
-c 用来提取指定数量的字符,适用于不规则的文本,也就是没有规律可找
cut -d : -f1 /etc/passwd == awk -F : {'print $2'}
cut -c 1-4 提取 /etc/passwd 用户名的前四个字符
awk -F 指定分隔符(空格不用指定) {'print $X'} 打印(输出)指定的列
字符定位提权方法:
grep 以行为单位 过滤的关键字最好唯一
cut 以列为单位 找到分隔符(空格)
awk 默认以空格作为分隔符
通常现使用 grep 找到提取的行,再使用 cut 提取指定的列
注意:如果过滤的字符是不可见字符,比如空格、换行符;此时 cut 的缺点就很明显,因为要不断的尝试找到指定数量的字符
六、文本的分析工具
1.文本统计
wc 统计一个文本的行数 单词 字节数
wc passwd
39 90 2167 /etc/passwd
39 表示的是文本的行数
90 表示的文本中的单词数
2167 字节数
wc -l 统计文本的行数
wc -w 统计文本的单词数
wc -c 统计文本的字节数
应用场景:统计系统中的用户、统计文件的数量 ......
2. 文本排序
sort 来对文本进行排序
sort 默认根据字符表的顺序来进行排序(而不是根据字母或者是数字来进行排序)
sort:
-t 使用某个字符来作为分隔符
-k 使用第几列来进行排序
-n 按照数字的方式进行排序(也就是从小到大 升序)
-r 按照数字的方式进行排序(通常和 -n 连用从大到小 降序)
-u 去重(去掉不连续重复的行)
-f 忽略大小写
去重专有工具 uniq
uniq 只能去掉来连续重复的行,而 sort 可以去掉不连续重复的行
因此 uniq 一般和 sort 连用
uniq -c 统计重复出现行数
3. 文本比较
diff 命令行工具 用来比较文件的差异
c 改变的内容
a 新增的内容
d 删除的内容
vimdiff diff 的图形化比较工具
七、文本处理
1.文本处理
tr 用来做字符转换
大写转小写 tr a-z A-Z
数字转字母 tr 0-3 a-d
tr -d 用来在标准输出上删除指定的字符(而不是在文件中将字符删除)
tr -d zhangsan < users.txt
2.流处理器(流编辑器 Stream edit)
sed 流编辑器工具
以流的形式在处理文本的内容
PS:sed 默认是不会修改文件内容,因为所有对于文本的处理都是在模式空间完成
-n 不输出模式空间的内容
-i 直接修改源文件
-e 同时执行多条 sed 的指令
-r sed 模式支持基本的正则,如果是扩展的正则则需要使用 -r
sed 的地址定界
# 一个具体的数字,可以是一个具体的行数
$ 表示文本的最后一行
/regexp/ 使用一个关键字来作为地址 使用 l 忽略大小写
\%regexp% 如果地址中包含了 / 特殊字符,此时需要转义
sed -n '\%/etc/%lp' passwd
1,10 表示匹配一个范围
sed -n '0,/ftp/p' passwd 表示从开始行到第一次找到 ftp 的行之间,且不含这两行
sed -n '/huawei/,/yutian/p' passwd 表示从 huawei 开始的行到 yutian 结束的行之间的内容
1~2 指定被搜索地址的步长
1,+10 指定从第一行开始的下面十行内容,一共十一行(不包含第一行)
1,~10 指定从第一行开始的十行内容,一共十行(包含第一行)
地址定界注意事项:
1、如果没有指定地址,表示命令将应用于每一行
2、如果只有一个地址,表示命令将应用于这个地址匹配的所有行
3、如果指定了由逗号分隔的两个地址,表示命令应用于匹配第一个地址和第二个地址之间的行(包括这两行)
4、如果地址后面跟有感叹号,表示命令将应用于不匹配该地址的所有行
sed 的动作
p 输出模式空间的内容(处理的行,在模式空间中输出)
d 删除匹配的行
a\Text 在匹配行之后追加文本
i\Text 在匹配行之前追加文本
c\Text 与匹配行交换文本
查找替换(单个关键字):
s/查找关键字/替换关键字/动作
动作:g 全局替换 i 忽略大小写 p 打印
sed '1,3w /opt/test123.txt' new.txt 将文本的内容另存为到指定的文件