4.2 Linux文本处理工具

命运要你成长的时候,总会安排一些让你不顺心的人或事刺激你;
等你的身体出了什么毛病,你就会意识到什么烦心事都是屁,都是吃饱了撑的,都是闲的,健康活着比什么都重要。


命令目录:

  1. [文件查看]: [cat] [tac] [rev] [more][less]
  2. [按行截取]: [head] [tail]
  3. [转化内容]: [tr]
  4. [按列操作]: [cut] [paste]
  5. [分析文本]: [wc] [sort] [uniq] [diff、patch]
  6. [按关键字过滤]: [grep]

1. 文件查看

cat

查看文件,从第一行到最后一行全部显示。

参数:

  • -E: 显示行结束符$
  • -A:显示不可打印字符,通常查看脚本是否有多加空格tab回车之类的。
  • -n:对显示出的每一行进行编号
  • -s:显示行号,压缩连续的空行,只显示一行空行
  • -b:空行不加行号,等同于nl命令

示例:

[root❄centos7 app]☭ cat catfile
AAA BBB
CCC DDD
EEE

GGG

HHH
[root❄centos7 app]☭ cat -A catfile 
AAA^IBBB$
CCC DDD$
EEE$
$
GGG$
$
$
HHH$
[root❄centos7 app]☭ cat -n catfile 
     1  AAA BBB
     2  CCC DDD
     3  EEE
     4  
     5  GGG
     6  
     7  
     8  HHH
[root❄centos7 app]☭ cat -b catfile
     1  AAA BBB
     2  CCC DDD
     3  EEE

     4  GGG


     5  HHH
[root❄centos7 app]☭ cat -s catfile
AAA BBB
CCC DDD
EEE

GGG

HHH

tac

从后往前显示文件,和cat相反。
示例:

[root❄centos7 app]☭ tac catfile
HHH
GGG
EEE
CCC DDD
AAA BBB

rev

reverse lines水平反转每一行里的字母。

示例1,水平翻转文件:
[root❄centos7 app]☭ rev catfile 
BBB AAA
DDD CCC
EEE
GGG
HHH

示例2,倒序+水平翻转文件:
[root❄centos7 app]☭ tac catfile | rev
HHH
GGG
EEE
DDD CCC
BBB AAA

more

分页显示,显示到最后会退出。

空格或者f下一页
b上一页(管道后跟more无法上一页)

less

分页显示,显示到最后也不会退出,要按q退出;
翻屏操作:

键盘按键 效果
空格键 向下滚动一屏
b 向上滚动一屏
j 向下移动一行
k或回车 向上移动一行
gg 跳转至第一行
5g 跳转到第5行
G 跳转到最后一行
q 退出

文本搜索:

键盘按键 效果
/keyword 向下查找,不区分大小写
?keyword 向上查找,不区分大小写
n 查找下一个,与查找方向相同
N 查找上一个,与查找方向相反

2. 按行截取

head

取文件头部的行,默认头10行。

参数:

  • -c NUM:显示几个字符
  • -n NUM:显示几行

# 取随机数里,数字或字母的字符,取前20个字符,可以用来做随机密码。
cat /dev/urandom | tr -dc "0-9a-zA-Z" | head -c 20

tail

显示文件尾部的行,默认最后10行。

参数:
-c NUM:只显示倒数几个字符。
-n NUM:示倒数几行。
-f:follow,跟踪这个文件的变动,用来看日志比较多

例子:
tail -n0 -f /var/log/messages &`

-n0只显示新增加的内容,命令最后加一个&,表示放在后台运行,可以去运行其他命令不受影响。当日志变动的时候,会在前台打印出一条,按回车可以继续运行其他命令。

3. 转化内容

tr

tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符

参数:

  • tr SET1 SET2 < /path/from/somefile`对位转化SET1中的字符为SET2中的字符
  • tr -d SET1 < /path/from/somefile`删除指定集合里出现的字符
  • tr -s "\n" /path/from/somefile`把指定的连续的字符以一个字符表示,压缩。
  • tr -c Complement ,取字符集的补集,通常与其他参数结合使用,例如`-dc
[root❄centos7 ~]☭ tr 'a-z' 'A-Z'
aabbcc33
AABBCC33
^C

[root❄centos7 ~]☭ tr 'a-z' 'A-Z'  /app/issue2
[root❄centos7 ~]☭ cat /app/issue2
\S
KERNEL \R ON AN \M

tips:如果是输入后再输出到同一个文件,就会清空这个文件,所以最好不要这么用,下面是一个错误示范:

[root❄centos7 ~]☭ cd /app/
[root❄centos7 app]☭ cp issue2 issue3
[root❄centos7 app]☭ tr 'a-z' 'A-Z' < issue3 >issue3
[root❄centos7 app]☭ cat issue3
[root❄centos7 app]☭

追加是可以的,在原有文件基础上再追加一段:

[root❄centos7 app]☭ cat issue2
\S
KERNEL \R ON AN \M

[root❄centos7 app]☭ tr 'A-Z' 'a-z' < issue2 >> issue2
[root❄centos7 app]☭ cat issue2
\S
KERNEL \R ON AN \M

\s
kernel \r on an \m

dc结合使用:

[root❄centos7 app]☭ echo {a..z} >f1
[root❄centos7 app]☭ cat f1
a b c d e f g h i j k l m n o p q r s t u v w x y z

[root❄centos7 app]☭ tr -d 'f-n' 

4. 按列操作

cut

cut可以实现分割每一行,并且指定输出列的字段。

  • -d DELIMITER:指定分隔符(delimiter)
  • -f FIELDS:取指定列字段(fileds)

示例1:

# 以冒号作为分隔符,取1到3、7的字段
cut -d: -f1-3,7 /etc/passwd

# 结果
root:x:0:/bin/bash
LongDream:x:1000:/bin/bash
yu:x:1001:/bin/bash
alice:x:1002:/bin/bash
tom:x:1003:/bin/bash

示例2:

# 取磁盘利用率,先tr压缩空格为一个空格,然后以空格作为分隔符,取第五个字段
df |tr -s " "| cut -d" " -f5
# 结果
Use%
5%
0%
0%
1%
0%
1%
22%
0%

paste

把多个文件的多行进行合并,逐行进行合并。

参数:
-d指定分隔符,默认是tab
-s把每个文件里的多行合成一行,每个文件一行。

示例:

[root❄centos7 app]☭ cat file1
name
aaa
bbb
ccc
[root❄centos7 app]☭ cat file2
age
18
20
22
[root❄centos7 app]☭ paste file1 file2
name    age
aaa     18
bbb     20
ccc     22
[root❄centos7 app]☭ paste -d: file1 file2
name:age
aaa:18
bbb:20
ccc:22
[root❄centos7 app]☭ paste -s file1 file2
name    aaa bbb ccc
age 18  20  22

5. 分析文本

wc

直接运行原wc命令:输出文件中的行数、单词数、字节数

参数:

  • -c:输出字节数
  • -m:输出字符数
  • -l :输出行数
  • -L:输出最长的行的长度。
  • -w: 输出单词统计数。
[dell@Centos7 data]$ echo "how old are you?" | wc
      1       4      17
# 1行4个单词17个字符;

sort

排序,默认是按照字符的大小来排列

  • -t :指定分隔符
  • -k:以哪一个为分割
  • -n:按数字大小排列,从小到大
  • -r:反向,从打到小
  • -u:删除重复的行

示例1:

# 以冒号分割,取第三列UID,nr表示按照数值大小倒序(由大到小)排列。
sort -t: -k3 -nr /etc/passwd
# 先cut只留第一列用户名和第三列UID
cut -d: -f1,3 /etc/passwd | sort -t: -k2 -nr

示例2:

# 取分区使用率最大值
df |tr -s " " "%"|cut -d% -f5|sort -nr|head -n1

uniq

唯一,从输入中删除前后相接的重复的行
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行

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

# 把用户名列表进行排序(重复的会在相邻的行),然后统计重复用户出现的次数:
sort userlist.txt | uniq -c
# 登录用户的登录次数:
last | cut -d ' ' -f1|sort| uniq -c |sort -nr

diff、patch——手动实现版本控制的工具

diff比较两个文件的区别

# 比较两个文件的区别,发现第5行有区别
diff foo.conf-broken foo.conf-works
5c5
< use_widgets = no
---
> use_widgets = yes

patch可以用diff生成的patch来修复另一个文件。

diff -u foo.conf-broken foo.conf-works > foo.patch #把差异写到foo.patch补丁里
cp foo.conf-broken foo.conf-broken.bak #备份一下
patch -b foo.conf-broken foo.patch # 从差异的补丁进行恢复

6. 按关键字过滤

grep

文本过滤工具
不带参数普通用法:

grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

带参数:

  • -v:显示不被pattern匹配到的行
  • -i:忽略字符大小写
  • -n:显示匹配的行号
  • -c:统计匹配的行数
  • -o:仅显示匹配到的字符串
  • -q:静默模式,不输出任何信息(quiet,可以结合echo $?状态码使用)
  • -A NUM after, 包含匹配行的后NUM行
  • -B NUM:before, 包含匹配行的前NUM行
  • -C NUM context, 包含匹配行的前后各NUM行
  • -e: 实现多个选项间的逻辑or关系
  • -w匹配整个单词(字母、下划线、数字汉字,这几个连在一起算一个单词)
  • -E使用ERE
  • -F相当于fgrep,不支持正则表达式

参考书籍:关于grep的各个参数的具体用法,可以看《Linux Shell 脚本攻略(第2版)》4.3章节,有详细说明,这里不做赘述。

例子:

# 扫描172.16.252。0段的机器,如果主机是up状态(Host is up)的,显示之前一行(-B1),前一行有ip地址,然后grep for是因为只有有ip的那行有for,然后以空格为分隔符,取第五个,就是ip地址。
nmap -v -sP 172.17.252.0/24 |grep -B1 "Host is up."|grep for|cut -d" " -f5

你可能感兴趣的:(4.2 Linux文本处理工具)