Linux入门之Linux下的文本处理(Ubuntu)

文件查看

- 对于文件内容的查看,可以用"cat -A 文件名“命令来查看文件里的文本内容。

-A --显示所有等信息
-b --数字非空数字非空输出行,覆盖-n
-e --等价于-vE
-E --每行末尾显示$
-n --所有输出行的编号
-s --挤压空白抑制重复的空输出行
-t --相当于-vT
-T --显示选项卡将选项卡字符显示为^I
-v --显示非打印使用^和M-符号,除了LFD和TAB

示例:

liuyan@liuyan-virtual-machine:~$ cat -A 1.txt 
  • 同时对于较长的文本,需要用cat命令配合其他命令来使用,如:more,less,head,tail等。
    more:
    more功能类似 cat ,more命令从前向后读取文件, more会以一页一页的显示方便使用者逐页阅读,按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。
-num 一次显示的行数
-d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声
-l 取消遇见特殊字元 ^L时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示

示例:

liuyan@liuyan-virtual-machine:/dev$ ls |more

less:
less 命令也是对文件或其它输出进行分页显示的工具。less 的用法比起 more 更加的具有优势。使用 less 时,可以使用 pageup],pagedown]等按键来往前往后翻看文件,更容易用来查看一个文件的内容!

-b 设置缓冲区的大小
-f  强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g  只标志最后搜索的关键词
-i  忽略搜索时的大小写
-m  显示类似more命令的百分比
-N  显示每行的行号
-o 将less 输出的内容在指定文件中保存起来
-Q  不使用警告音
-s  显示连续空行为一行
-S  行过长时间将超出部分舍弃
-x 将“tab”键显示为规定的数字空格
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b  向后翻一页
d  向后翻半页
h  显示帮助界面
Q  退出less 命令
u  向前滚动半页
y  向前滚动一行
pagedown: 向下翻动一页
pageup:   向上翻动一页

示例:

liuyan@liuyan-virtual-machine:/dev$ ls |less

head:
head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。

-c,  --  显示每个文件的前K 字节内容;如果附加"-"参数,则除了每个文件的最后K字节数据外 显示剩余全部内容
-n, --  显示每个文件的前K 行内容;如果附加"-"参数,则除了每个文件的最后K行外 显示剩余全部内容
-q, --  不显示包含给定文件名的文件头
-v, --   总是显示包含给定文件名的文件头

示例:

liuyan@liuyan-virtual-machine:/dev$ ls |head -n 1
agpgart

tail:
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

-f   循环读取
-q  不显示文件名
-v  显示文件名
-c  显示文件最后N字节内容
-n  显示行数

示例:

liuyan@liuyan-virtual-machine:/dev$ ls |tail -n 1
zfs

文本抽取管理

- 大多情况下我们更希望从某一出文本中筛选出重要内容,这就用到cut(剪切)工具。
cut:
cut命令可以从一个文本文件或者文本流中提取文本列,从而实现数据抽取

-b--仅显示行中指定直接范围的内容;
-c--仅显示行中指定范围的字符;
-d--指定字段的分隔符,默认的字段分隔符为“TAB”;
-f--显示指定字段的内容;
-n--与“-b”选项连用,不分割多字节字符;
--complement--补足被选择的字节、字符或字段;

示例:

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1
/dev/sda1 49G 9.2G 38G 20% /
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1|cut -d " " -f 5
20%

文本分析

- 针对某一文本内容我们可能需要对其进行排序,比较,统计其出现的次数等,从而更好的对文本内容进行分析,以便寻找里面的信息。

sort:
sort命令可以帮我们依据不同的数据类型进行排序

-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序。

uniq:
使用uniq命令可以在最左侧报告或忽略文件中的重复行,一般与sort 连用

-c--在每列旁边显示该行重复出现的次数。
-d--仅显示重复出现的行列。
-f--忽略比较指定的栏位。
-s--忽略比较指定的字符。
-u--仅显示出一次的行列。
-w--指定要比较的字符。
-n--前n个字段和每个字段前的空白一起被忽略

tr:
tr命令可以对来自标准输入的字符进行替换、压缩和删除。

-c--取代所有不属于第一字符集的字符
-d--删除所有属于第一字符集的字符
-s--把连续重复的字符以单独一个字符表示
-t--先删除第一字符集较第二字符集多出的字符

综合案例

案例一:
找出ifconfig “网卡名”命令结果中本机的IPv4地址
1.输入ifconfg命令查看本机IP地址,我们可以看到目标IP地址在第二行

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.79.131  netmask 255.255.255.0  broadcast 192.168.79.255
       inet6 fe80::81a:a8bd:29cd:b06c  prefixlen 64  scopeid 0x20<link>
       ether 00:0c:29:1a:6b:07  txqueuelen 1000  (Ethernet)
       RX packets 357  bytes 45624 (45.6 KB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 275  bytes 30555 (30.5 KB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1000  (Local Loopback)
       RX packets 198  bytes 15868 (15.8 KB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 198  bytes 15868 (15.8 KB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. 通过管道配合tr命令压缩信息之间的空格

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
RX packets 379 bytes 47582 (47.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 283 bytes 31441 (31.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 202 bytes 16192 (16.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 202 bytes 16192 (16.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

3. 再利用sort命令按照字母对显示信息排序,这时目标信息在第四行

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
 inet 127.0.0.1 netmask 255.0.0.0
 inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
 inet6 ::1 prefixlen 128 scopeid 0x10<host>
 inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
 loop txqueuelen 1000 (Local Loopback)
 RX errors 0 dropped 0 overruns 0 frame 0
 RX errors 0 dropped 0 overruns 0 frame 0
 RX packets 221 bytes 17953 (17.9 KB)
 RX packets 466 bytes 55914 (55.9 KB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 TX packets 221 bytes 17953 (17.9 KB)
 TX packets 340 bytes 40387 (40.3 KB)

4. 若想提取目标信息我们需要将提取范围缩小,这时利用head命令提取出信息前四行

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 4
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
 inet 127.0.0.1 netmask 255.0.0.0
 inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255

5. 然后通过tail命令成功提取目标信息

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1
 inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255

6. 这时我们需要将目标IP分离,利用cut命令将多余信息分离即可

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1|cut -d " " -f 3
192.168.79.131

案例二:
查出分区空间使用率的最大百分比值

1. 输入df命令查看目录下各目标文件使用率

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           391M  2.0M  389M   1% /run
/dev/sda1        49G  9.2G   38G  20% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop0      4.3M  4.3M     0 100% /snap/gnome-calculator/544
/dev/loop3       35M   35M     0 100% /snap/gtk-common-themes/818
/dev/loop2       92M   92M     0 100% /snap/core/8689
/dev/loop7      2.3M  2.3M     0 100% /snap/gnome-calculator/260
/dev/loop1       45M   45M     0 100% /snap/gtk-common-themes/1440
/dev/loop5      1.0M  1.0M     0 100% /snap/gnome-logs/81
/dev/loop9      3.8M  3.8M     0 100% /snap/gnome-system-monitor/57
/dev/loop6       91M   91M     0 100% /snap/core/6350
/dev/loop4      141M  141M     0 100% /snap/gnome-3-26-1604/74
/dev/loop11      13M   13M     0 100% /snap/gnome-characters/139
/dev/loop8      161M  161M     0 100% /snap/gnome-3-28-1804/116
/dev/loop10      55M   55M     0 100% /snap/core18/1668
/dev/loop12     141M  141M     0 100% /snap/gnome-3-26-1604/98
/dev/loop15     3.8M  3.8M     0 100% /snap/gnome-system-monitor/127
/dev/loop13      15M   15M     0 100% /snap/gnome-characters/399
/dev/loop14      15M   15M     0 100% /snap/gnome-logs/45
tmpfs           391M   16K  391M   1% /run/user/121
tmpfs           391M   24K  391M   1% /run/user/1000
/dev/sr0        1.9G  1.9G     0 100% /media/liuyan/Ubuntu 18.04.2 LTS amd64

2. 通过管道配合tr命令压缩显示信息

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 391M 2.0M 389M 1% /run
/dev/sda1 49G 9.2G 38G 20% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/loop0 4.3M 4.3M 0 100% /snap/gnome-calculator/544
/dev/loop3 35M 35M 0 100% /snap/gtk-common-themes/818
/dev/loop2 92M 92M 0 100% /snap/core/8689
/dev/loop7 2.3M 2.3M 0 100% /snap/gnome-calculator/260
/dev/loop1 45M 45M 0 100% /snap/gtk-common-themes/1440
/dev/loop5 1.0M 1.0M 0 100% /snap/gnome-logs/81
/dev/loop9 3.8M 3.8M 0 100% /snap/gnome-system-monitor/57
/dev/loop6 91M 91M 0 100% /snap/core/6350
/dev/loop4 141M 141M 0 100% /snap/gnome-3-26-1604/74
/dev/loop11 13M 13M 0 100% /snap/gnome-characters/139
/dev/loop8 161M 161M 0 100% /snap/gnome-3-28-1804/116
/dev/loop10 55M 55M 0 100% /snap/core18/1668
/dev/loop12 141M 141M 0 100% /snap/gnome-3-26-1604/98
/dev/loop15 3.8M 3.8M 0 100% /snap/gnome-system-monitor/127
/dev/loop13 15M 15M 0 100% /snap/gnome-characters/399
/dev/loop14 15M 15M 0 100% /snap/gnome-logs/45
tmpfs 391M 16K 391M 1% /run/user/121
tmpfs 391M 24K 391M 1% /run/user/1000
/dev/sr0 1.9G 1.9G 0 100% /media/liuyan/Ubuntu 18.04.2 LTS amd64

3. 以利用率为目标将显示信息排序

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5
/dev/sr0 1.9G 1.9G 0 100% /media/liuyan/Ubuntu 18.04.2 LTS amd64
/dev/loop9 3.8M 3.8M 0 100% /snap/gnome-system-monitor/57
/dev/loop8 161M 161M 0 100% /snap/gnome-3-28-1804/116
/dev/loop7 2.3M 2.3M 0 100% /snap/gnome-calculator/260
/dev/loop6 91M 91M 0 100% /snap/core/6350
/dev/loop5 1.0M 1.0M 0 100% /snap/gnome-logs/81
/dev/loop4 141M 141M 0 100% /snap/gnome-3-26-1604/74
/dev/loop3 35M 35M 0 100% /snap/gtk-common-themes/818
/dev/loop2 92M 92M 0 100% /snap/core/8689
/dev/loop15 3.8M 3.8M 0 100% /snap/gnome-system-monitor/127
/dev/loop1 45M 45M 0 100% /snap/gtk-common-themes/1440
/dev/loop14 15M 15M 0 100% /snap/gnome-logs/45
/dev/loop13 15M 15M 0 100% /snap/gnome-characters/399
/dev/loop12 141M 141M 0 100% /snap/gnome-3-26-1604/98
/dev/loop11 13M 13M 0 100% /snap/gnome-characters/139
/dev/loop10 55M 55M 0 100% /snap/core18/1668
/dev/loop0 4.3M 4.3M 0 100% /snap/gnome-calculator/544
/dev/sda1 49G 9.2G 38G 20% /
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 391M 24K 391M 1% /run/user/1000
tmpfs 391M 2.0M 389M 1% /run
tmpfs 391M 16K 391M 1% /run/user/121
udev 1.9G 0 1.9G 0% /dev
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 2.0G 0 2.0G 0% /dev/shm
Filesystem Size Used Avail Use% Mounted on

4. 通过grep命令过滤目标信息,这时我们看到目标的完整信息

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1
/dev/sda1 49G 9.2G 38G 20% /

5. 通过cut命令提取出百分比可进行进一步运算

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1|cut -d " " -f 5
20%

案例三:
查出/tmp的权限,以数字方式显示
1. 通过stat命令显示文件全部信息,这时我们可以看到目标信息位于第四行(1777)

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp
  File: /tmp
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d	Inode: 1966081     Links: 14
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
 Birth: -

2. 首先将显示信息压缩方便进一步操作

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "
 File: /tmp
 Size: 4096 	Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d	Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
 Birth: -

3. 进一步提取前四行信息,缩小范围

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4
 File: /tmp
 Size: 4096 	Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d	Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)

4. 通过cut命令剪切目标信息做最后提取

liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1
Access: (1777
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1|cut -d "(" -f 2
1777
发布了15 篇原创文章 · 获赞 18 · 访问量 739

猜你喜欢

转载自blog.csdn.net/qq_42452450/article/details/104577900
今日推荐