文本处理及shell编程

1.文本处理工具

1.1文本处理工具

1.1.1 文本编辑工具vim

命令格式

vim [OPTION]...FILE...  

常用选项:

+#					打开文件后,让光标处于第 # 行的行首,+默认行尾
+/PATTERN			让光标处于第一个被 PATTERN 匹配行的行首
-b file				二进制方式打开文件
-d file1 file2		比较多个文件,相当于 vimdiff
-m file				只读打开文件
-e file				直接进入 ex 模式,相当于执行 ex file
-y file				Easy mode (like "evim",modeless),直接可以操作文件,ctrl+o:wq | q! 保存和不保存退出

说明:

  • 如果该文件存在,文件被打开并显示内容
  • 如果该文件不存在,当编辑后第一次存盘时创建它

模式转换

命令模式 —> 插入模式

i		insert,在光标所在处输入
I		在当前光标所在行的行首输入
a		append,在光标所在处后面输入
A		在当前光标所在行的行尾输入
o		在当前光标所在行的下放打开一个新行
O		在当前光标所在行的上访打开一个新行

插入模式 —ESC----->命令模式
命令模式 — : -----> 扩展命令模式
扩展命令模式 —ESC,enter----->命令模式

1.1.2 查看文件内容

cat 可以查看文本内容
命令格式:

cat [OPTION]... [FILE]...

常见选项

-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行

nl
显示行号,相当于cat -b

tac
逆向显示文本内容

rev
将同一行的内容逆向显示

查看非文本文件内容
范例:hexdump
在这里插入图片描述

more
可实现分页查看文件,可以配合管道实现输出信息的分页
格式:

more [OPTIONS] FILE

选项:

-d:显示翻页及退出提示

向下翻页: 空格键 向下翻页
向上翻页: ctrl + b 向上翻页
在这里插入图片描述

less
less 也是分页查看或者 STDIN 输出,less命令是 man 命令使用的分页器
查看时有用的命令包括:

/文本:搜索文本
n/N:跳到下一个 或 上一个匹配

向下翻页: 空格键 向下翻页
向上翻页: ctrl + b 向上翻页
在这里插入图片描述

显示文本前面活后面的行内容
head
格式

head [OPTION][FILE]

选项

-c # 指定获取前#字节
-n # 指定获取前#行,#如果为负数,表示从文件头取倒数第#前
-# 同上

例1:读取 passwd1 前三行
在这里插入图片描述

例2:读取 passwd1 前三行
在这里插入图片描述

例3:读取 passwd1 至倒数第三行
在这里插入图片描述

例4:读取 passwd1前5个字节
在这里插入图片描述

查看文件或标准输入的倒数行
tail
格式:

tail [OPTION][FILE]

常用选项

-c #: 指定获取后#字节
-n #: 指定获取后#行,如果#是正数,表示从第#行开始到文件结束
-#: 同上
-f: 跟踪显示文件新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除在新建同名文件,将无法继续跟踪。
-F: 跟踪文件名,相当于–follow-name --retry,当文件删除在新建同名文件,将可以继续跟踪文件

范例
例1:查看文件后3行
在这里插入图片描述
例2:从正数第三行到结尾
在这里插入图片描述

1.1.3 按列抽取文本 cut

cut命令的功能是按列提取文件内容。常用的grep命令仅能对关键词进行按行提取过滤,而cut命令则可以根据指定的关键词信息,针对特定的列内容进行过滤

格式

cut [OPTION][FILE]

常规选项

-d DELIMITER:指明分隔符,默认tab
-f FILDES:

#:第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段,例如:1-6
混合使用:1-3,7

-c:按字符切割
- -output-delimiter=STRING:指定输出分隔符

范例:

在这里插入图片描述

1.1.4 合并多个文件 paste

格式:

paste [OPTION][FILE]

选项:

-d #分隔符:指定分隔符,默认用TAB   
-s #所有行合成一行显示   

范例:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 文本分析工具

文本数据统计:wc
整理文本:sort
比较稳健:diff 和 path

1.2.1文本统计数据 wc

wc 命令可用于统计稳健的行总数、单词总数和字符总数,可以对文件或STDIN中的数据统计

常用选项:

-l 只计算行数
-w 只计算单词总数
-c 只计算字节总数
-m 只计算字符总数
-L 显示文件中最长行的长度

在这里插入图片描述
底下数据分别表示行数、单词数、字节数

1.2.2文本排序 sort

格式:

sort [options] file(s)

常用选项

-r 以相反的顺序来排序
-R 随机排序
-n 依照数值的大小排序
-h 人类可读排序,如:2k 1G
-f 忽略字符串中的字符大小写
-u 合并重复项,即 去重
-t 设置排序时所用的分割符
-k 指定需要排序的列
-o 将排序结果存入指定文件中

范例
按第三列数字大小倒序排序
在这里插入图片描述

1.2.3去重 uniq

uniq是对文本进行 行去重 的工具

  • 以行尾单位,进行 行与行 之间的字符串比较 并进行去重
  • 只能对有序的文本进行有效去重,所以常与 sort 命令结合使用

格式

uniq [OPTION]... [FILE]...

常见选项

-c 统计 每行 重复出现的次数
-d 只显示重复过的行
-u 只显示不曾重复过的行
-i 忽略字母大小写
-f 忽略前N个字段(字段剪用空白字符分隔)

uniq常和sort 命令一起配合使用:
范例:取两个文件的相同和不同的行

在这里插入图片描述
在这里插入图片描述

范例: 统计出现的次数

在这里插入图片描述

1.2.4 比较文件

diff 命令比较两个文件之间的区别

-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

范例:

在这里插入图片描述
test1中第1行与test2中第1行不匹配
test1中第6-9行与test2中第6-7行不匹配,需要修改左边6、7行

patch
patch 复制在其它文件中进行的改变(要谨慎使用)
在这里插入图片描述
复制改变之后,会使两文件,如上a.txt与b.txt相同

vimdiff
相当于 vim -d
在这里插入图片描述
在这里插入图片描述

2 文件查找工具

2.1 find

find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

格式:

find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所
有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕

根据文件名查找

查找sort.txt这个文件,从/开始查找,即在Linux所有挂载的分区和目录中查找
在这里插入图片描述

只查找.txt结尾的文件
在这里插入图片描述

从某个目录开始查找文件

从当前用户的家目录开始查找
在这里插入图片描述
从当前目录开始查找
在这里插入图片描述
从/root目录开始查找
在这里插入图片描述

忽略大小写
查找文件名带有abc的文件,忽略大小写
使用选项-iname
在这里插入图片描述

根据文件类型查找
使用选项-type
查找某一类型的文件,例如:
b – 块设备文件。
d – 目录。
c – 字符设备文件。
p – 管道文件。
l – 符号链接文件。
f – 普通文件

在/etc目录下查找所有的目录,并打印出来
在这里插入图片描述

在当前目录下查找除目录以外的所有类型的文件
在这里插入图片描述

基于目录深度搜索
查找当前目录及向下最大深度限制为3的所有文件
在这里插入图片描述

基本文件时间查找
使用格式:
find . -type f 时间类型

UNIX/Linux文件系统每个文件都有三种时间类型:

访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

搜索最近七天内被访问过的所有文件
在这里插入图片描述

搜索恰好在5天前被访问过的所有文件
在这里插入图片描述

搜索超过七天内被访问过的所有文件
在这里插入图片描述
根据文件大小查找
使用格式:
find . -type f -size 文件大小

文件大小单元:
b——块(512字节)
c——字节
w——字(2字节)
k——千字节
M——兆字节
G——吉字节

查找大于10KB的文件
在这里插入图片描述

根据文件权限/所有权进行匹配
当前目录下搜索出权限为755的文件
在这里插入图片描述

找出当前目录用户wang拥有的所有文件
在这里插入图片描述

2.2 locate

locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库,CentOS7数据库的位置在/var/lib/locatedb,CentOS6数据库位置在/var/lib/mlocate/mlocate.db,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,默认情况下每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

工作特点:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只搜索用户具备读取和执行权限的目录

格式:

locate [OPTION]... [PATTERN]...

常用选项

-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式

安装locate工具:
在这里插入图片描述
更新数据库,即把系统中所有文件信息写入数据库/var/lib/mlocate/mlocate.db

sudo updatedb

范例:

#搜索名称或路径中包含“conf"的文件,显示前三个 
wang@ubuntu2004:~$ locate -n 3 conf 
/boot/config-5.4.0-167-generic 
/boot/config-5.4.0-169-generic 
/boot/grub/i386-pc/configfile.mod 

2.3 参数替换 xargs

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数

据,并且以空格符或回车符将 stdin 的数据分隔成为参数
另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find 经常和 xargs 命令进行组合,形式如下:

find | xargs COMMAND 

范例:
显示10个数字
在这里插入图片描述

用grep命令在所有的普通文件中搜索hello这个词
在这里插入图片描述

3 文本处理三剑客

3.1 grep

grep是一个文本搜索工具,根据用户指定的模式(过滤条件),对文本逐行进行匹配检查;打印匹配到的行。

模式:有正则表达式的元字符及文本字符所编写的过滤条件
格式:

grep [OPTIONS]  PATTERN   [FILE...]

常用选项:

--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止  
-v 显示不被pattern匹配到的行,即取反  
-i 忽略字符大小写  
-n 显示匹配的行号  
-c 统计匹配的行数  
-o 仅显示匹配到的字符串  
-q 静默模式,不输出任何信息  
-A # after, 后#行  
-B # before, 前#行  
-C # context, 前后各#行  
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file  
-w 匹配整个单词  
-E 使用ERE,相当于egrep  
-F 不支持正则表达式,相当于fgrep  
-P 支持Perl格式的正则表达式  
-f file 根据模式文件处理  
-r 递归目录,但不处理软链接  
-R 递归目录,但处理软链接  

范例:

grep root /etc/passwd
grep "USER" /etc/passwd
grep 'USER' /etc/passwd
grep whoami /etc/passwd

在这里插入图片描述

3.2 sed

sed是一种新型的,非交互式的编辑器

sed编辑器逐行处理文件,并将结果输出到屏幕。sed把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed把每一行都存在模式空间里,对这个副本进行编辑。所以不会修改或者破坏源文件。

格式:

sed [option]... 'script;script;...' [inputfile...]  

常用选项:

-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
#说明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 危险选项,会清空文件

地址格式:

  1. 不给地址:对全文进行处理
  2. 单地址:
    #:指定的行,$:最后一行 /pattern/:被此处模式所能够匹配到的每一行
  3. 地址范围:
    #,# #从#行到第#行,3,6 从第3行到第6行
    #,+# #从#行到+#行,3,+4 表示从3行到第7行 /pat1/,/pat2/
    #,/pat/ /pat/,#
  4. 步进:~ 1~2 奇数行 2~2 偶数行

命令:

p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q 结束或退出sed

查找替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写

范例:

#默认sed会将输入信息直接输出                              
wang@ubuntu2004:~$ sed ''                              
wang                              
wang                              
user                              
user                              
welcome                              
welcome                              
#它打印出/etc/passwd 文件中的所有行
wang@ubuntu2004:~$ sed -n 'p'  /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
......

3.3 awk

awk是一种编辑语言,用于对文本和数据进行处理。出书可以来自标准输入,一个或多个文件,或其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能。

awk对文件逐行扫描,寻找匹配的特定模式的行,对其进行操作

有多种版本:

  • AWK:原先来源于 AT & T 实验室的的AWK
  • NAWK:New awk,AT & T 实验室的AWK的升级版
  • GAWK:即GNUAWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

gawk:模式扫描和处理语言,可以实现下面功能

  • 文本处理
  • 输出格式化的文本报表
  • 执行算数运算 执行字符串操作

格式:

awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…

说明:
program通常是被放在单引号中,并可以由三种部分组成

  • BEGIN语句块
  • 模式匹配的通用语句块
  • END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
  • -v var=value 变量赋值

Program格式:

pattern{action statements;..}

pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等
action statements:对数据进行处理,放在{}内指明,常见:print, printf

awk包含几个特殊的内建变量(可直接用)如下所示

内置变量功能
NF当前处理的行的字段个数(就是:有多少列)
NR当前处理的行的行号(就是:有多少行)
FNR读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
$0当前处理的行的整行内容(就是:表示一行的内容)
$n当前处理行的第n个字段(就是:第n列)
FILENAME被处理的文件名
FS指定每行的字段分隔符,默认为空格或制表位(相当于选项 -F )
OFS输出字段的分隔符,默认也是空格
RS行分割符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录,而awk一次仅读取一条记录,预设值是“\n“
ORS输出分割符,默认也是换行符

范例1:结合print进行输出,默认分隔符
在这里插入图片描述

范例2:结合print进行输出,设定分隔符
在这里插入图片描述

范例3 输出时显示列的空格
在这里插入图片描述

范例4:设置多个分隔符, 截取第七列
在这里插入图片描述

4.正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)

不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配
符功能是用来处理文件名,而正则表达式是处理文本内容中字符
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等

正则表达式分两类:

  • 基本正则表达式:BRE Basic Regular Expressions
  • 扩展正则表达式:ERE Extended Regular Expressions

4.1 基本正则表达式

字符匹配

	. 匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围
广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
-----------------
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\r\t\v]。注意 Unicode
正则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价于 [^\f\r\t\v]
\w #匹配一个字母,数字,下划线,汉字,其它国家文字的字符,等价于[_[:alnum:]字]
\W #匹配一个非字母,数字,下划线,汉字,其它国家文字的字符,等价于[^_[:alnum:]字]

范例:
在这里插入图片描述

匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配   
.* #任意长度的任意字符   
\? #匹配其前面的字符出现0次或1次,即:可有可无   
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次   
\{n\} #匹配前面的字符n次   
\{m,n\} #匹配前面的字符至少m次,至多n次   
\{,n\} #匹配前面的字符至多n次,<=n   
\{n,\} #匹配前面的字符至少n次   

范例:匹配正负数
在这里插入图片描述

位置锚定

位置锚定可以用于定位出现的位置

^ #行首锚定, 用于模式的最左侧          
$ #行尾锚定,用于模式的最右侧          
^PATTERN$ #用于模式匹配整行          
^$ #空行          
^[[:space:]]*$ #空白行          
\<\b #词首锚定,用于单词模式的左侧          
\>\b #词尾锚定,用于单词模式的右侧          
\<PATTERN\> #匹配整个单词          
#注意: 单词是由字母,数字,下划线组成          

范例:
在这里插入图片描述

4.2 扩展正则表达式元字符

字符匹配
. 任意单个字符

[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

次数匹配

* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次

位置锚定

^ 行首  
$ 行尾  
\<, \b 语首  
\>, \b 语尾  

分组其它

() 分组    
后向引用:\1, \2, ... 注意: \0 表示正则表达式匹配的所有字符    
| 或者
a|b #a或b    
C|cat #C或cat    
(C|c)at #Cat或cat    

5 变量

变量

6 shell编程

shell编程

7 磁盘存储术语

磁盘存储术语

8 总结MBR,GPT结构

总结MBR,GPT结构

9 SWAP管理相关的命令

SWAP管理相关的命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值