一、文本处理工具之grep (基于行来匹配)
grep
egrep (文本过滤)
fgrep(不支持正则)
格式:grep [选项] 模式 文件
选项:
--color 指定颜色
-v:反向匹配,显示不能被模式匹配到的行
-o:仅匹配被模式匹配到的字符串,而非整行
-q:静默模式
无返回,可用echo $? 查询结果 0是有结果
-i:不区分大小写,ignore-case
二、正则表达式
分为基本正则表达式(BRE)和扩展正则表达式(ERE)
元字符:类似通配符,不表示字符本身的意义,用于额外功能性的描述
基本正则表达式的元字符:(出现需要用引号引起来,单引号也可以解释元字符,但不可变量替换)
1、匹配单个字符:
创建一个text.txt文档,内容如下
(1).:任意单个字符
如果想匹配.,可以使用转义符\
[]:指定范围内的任意单个字符
(2)数字:[0-9],[[:digit:]]
(3)小写字母:[a-z],[[:lower:]]
(4)大写字母:[A-Z],[[:upper:]]
(5)所有的字母:[a-Z],[[:alpha:]]
(6)字母+数字:[0-Z],[[:alnum:]]
(7)空格:[[:space:]] ,简化写法 [ ]
(8)标点符号:[[:punct:]]
(9)[^]: 指定范围外的任意单个字符
2、次数匹配:用来指定匹配其前面的字符的次数
(1)*:任意次
例子:x*y xxy xy y 都能匹配
(2).*:匹配任意长度的任意字符
\为转义符,因为? {} 在linux中有其他的意思,需要靠转义符来恢复原本的意思
(3)\?:前面字符出现0次或者1次的
\+:前面字符至少一次
\{m\}:匹配m次
\{m,n\}:至少m次,至多n次
\{m,\}:至少m次
\{,n}:至多n次 可以没有
当然也可以使用egrep (文本过滤)
就可以不使用转义符,是grep的优化版本
3、位置锚定:用于指定字符出现的位置
(1) ^:锚定行首
^Char
(2)$:锚定行尾
grepchar$
(3)^$:空白行
取所有非空白行,那几个空行是因为里面有空格,空格也是字符
三、文本处理类的命令
(1)wc: word count
行 单词数 字节数
wc[option][file]...
-l:统计行数
-c:统计字节数
-w:统计单词数
知识点补充:
管道:
Linux:
程序=指令+数据
使用目的单一的小程序
组合小程序完成复杂的任务
指令1 | 指令2 | 指令3
把指令1的结果给指令2,再把指令2的结果给指令3
(2)tr:转换或删除字符,tr ‘集合1’ ‘集合2’,必须使用管道
转换字符:会把第一个字符集的对应转换为第二个字符集中的对应转换
-d:删除出现过的字符集
tr不会改变原文件,使用tr把刚才text.Txt文件中的小写字母换成大写
(3) cut:根据制定的分隔符切片,并显示出需要显示的片
-d字符:指定分隔符
-f数字:指定要显示的字段
单个数字:一个字段
多个离散字段:逗号分隔
多个连续字段:-分隔
显示linux中的用户名和uid,passwd中用户每个信息使用:分隔,第一个为用户名,第三个为uid
(4)sort:按字符进行比较(默认比较码值)
格式 sort[options] FILE
-f:忽略大小写
-n:对数字进行排序
-t:指定分隔符
-k数字:指定分隔后进行比较字段
-u:重复的行,只显示一行
按照uid排序用户信息,数字排序-n,:分割-t:,比较uid:-k3
按照uid排序用户信息,并只显示uid最大者的用户名
四、find命令
实时查找工具,通过遍历指定路径下的文件系统完成文件查找。
1、特点:
查找速度慢
精确查找
实时查找
2、语法格式:
find [option]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下所有文件
处理动作:对符合条件的文件做什么操作,默认为标准输出至屏幕。、
3、查找条件:
(1)根据文件名查找:
-name "文件名称" (支持使用glob通配 *,?,[],[^]) 例如 find /etc -name "passwd*"
-iname "文件名称" (不区分大小写)
(2)根据属主 属组查找
-user USERNAME:查找属主为指定用户的文件
-group GROUPNAME:查找属组为指定用户的文件。
-uid UserID:查找属主为指定UID的文件
-gid GroupID:查找属主为指定GID的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
(3)根据文件类型查找:
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
(4)组合条件(与 或 非)
-a与 -o或 -not非
(5)根据文件大小来查找:
-size [+|-]num
常用单位:kb,Mb,G
-num:(0,num]
+num:(num,∞)
(6)根据时间戳:
以“天”为单位:
-atime:访问时间
-mtime:更改时间
-ctime:改动时间
可加:[+|-]
以“分钟”为单位:
-amin
-mmin
-cmin
(7)根据权限来查找
-perm [+|-]MODE
4、处理动作
-print:默认动作,输出至屏幕
-ls:类似ls -l命令
-delete:查找出然后删除
-fls /path/to/somefile
-ok COMMAND {} \;对查到的每个文件执行COMMAND命令,对于每个文件执行命令,需交互确认
-exec COMMAND {} \;直接处理,不交互。 {}:用于引用查找到的文件名称本身
以上的处理动作要求能看懂,有些老程序员爱使用
现在更加流行使用xargs
find命令不支持管道,那我们可以使用xargs命令强行驱动使用管道
五、重定向操作:I/O重定向
重定向某些情况直接覆盖比较危险,覆盖重定向谨慎使用。
1:输入重定向(覆盖和追加)
< 覆盖
<< 追加
标准输入,stdin,0
输入重定向的意思就是从文件中取出数据到指定的文件中
例如我们要创建user,设置密码的时候需要输入两次密码,我们先把密码写在文档中,然后重定向到设置密码的命令处。例如:
2:输出重定向(覆盖和追加)
>覆盖
>>追加
(1)标准输出,stdout,1 默认输出重定向,状态码为1
我们可以把指令的结果追加到文档中,例如:
(2)标准错误输出:stderr,2
当我们写错了指令写入到文档会发生什么?
但是我们同样可以将错误日志写入到文档,只需要使用标准错误输出
(3)混合输出 &
如果我们不知道输入的指令是错误的还是正确的十一使用混合输出
3、echo命令
echo可以看作python的print()
(1)-n:不输出为新行
用cat查看文档时我们可以用-E查看隐藏符号
$代表此行结束,可以使用-n让行不结束
(2)-e:允许后面的输出进行转义,可末尾接上特殊字符
\n:new line 换行且光标移至行首
\t:horizontal tab 插入制表符,8个格子,如果写入字符超过8个会再扩展8个;
练习题:用echo写一个正方形
六、VI编辑器的学习
Linux:使用文本文件来保存配置信息
文本编辑器:ASCII文件
emacs vi
vi:Visual Interface(纯字符界面的编辑器)
全屏文本编辑,nano
1、vi命令的使用格式
vim [options] /path/to/file
2、三种模式:编辑模式(命令模式 默认)、输入模式(插入模式)、末行模式(命令接口)
编辑模式:键盘操作通常被解析为编辑命令:
输入模式:写内容的模式
末行模式:vim的内置的命令行接口,执行vim内置命令
vim一进去就是编辑模式。
3、模式切换
(1)编辑模式-->输入模式
i:当前光标处输入内容 (多用这个)
I:在当前光标所在行的行首
a:在当前光标所在处的后面
A:在当前光标所在行的行尾输入
o:在光标所在行的下方新增一行空白行
O:在光标所在行的上方新增一行空白行
(2)输入模式-->编辑模式
按ESC
(3)编辑模式-->末行模式
输入 “:”
(4)末行模式-->编辑模式
按两次ESC
4、常用退出指令
(1)在末行模式下
:q!强制退出,不保存并退出
:wq 保存修改并退出
:w 保存不退出
:x,保存并退出
(2)编辑模式:
ZZ,保存退出
5、常用打开文档命令
分隔窗口打开多个文件
(1)-o:水平分隔:
切换文档:ctrl+w,上下箭头
vim -o 1.txt 2.txt
(2)-O:垂直分隔:
ctrl+w,左右箭头
vim -O 1.txt 2.txt
6、编辑模式下操作
【1】移动光标
(1)单字符光标移动
上下左右:jkhl,键盘上下左右键也行
(2)单词间移动:
w:调至下一个单词的词首
b:当前或前一个的词首
e:当前或下一个词的词尾
(3)行内移动:
0:行首
^:第一个非空白字符
$:行尾
(4)句子间移动:
):上一句
(: 下一句
(5)段落间移动:
}:上一段
{:下一段
(6)行间移动:(常用)
#G:第几行 在编辑模式输入数字+G就是跳转到第几行
gg:第一行
G:最后一行
【2】编辑操作
一部分需要输入数的命令显示在这里
x:删除光标所在处的字符
#x:删除光标所在处向后的#个字符
r:替换光标所在处的字符
d:删除命令(我们输入的有些命令会在编辑模式最下面,通过d可以删除)
d^ 光标删除至行首
d$ 光标删除至行尾(shift+d)
dd:删除一行
#dd:删除所在行后的#行
y:复制命令(复制输入的命令)
yy:复制当前一行 p粘贴
#yy:复制#行
p:paste 粘贴
如果复制的是整行
p:把复制的内容粘贴在当前行的下一行
P:把复制复制的内容粘贴在当前行的上一行
如果复制的为非整行
p:把复制的内容粘贴在光标所在字符的后面
P: 把复制的内容粘贴在光标所在字符的前面
撤销编辑
u:撤销
#u:最近50次操作
撤销此前的撤销操作:ctrl+r:
翻屏:
ctrl+f:向文件尾部翻一屏
ctrl+b:向文件首部翻一屏
ctrl+d:向文件尾部翻半屏
ctrl+u:向文件首部翻半屏
Enter:下一行
查找:
/keyword:从上往下搜索keyword
?keyword:从下往上搜索keyword
n:往下翻查找的结果
N:往上翻查找的结果
支持正则表达式
7、vim的可视化模式
编辑模式:
v:按照光标走过的区域选择
V:选择矩形行
ctrl+v:选择矩形
8、末行模式下
start,end:可以使用绝对定界,也可以使用相对定界
(1).:表示当前行
(2)$:最后一行
(3)$-2:倒数第3行
(4)d: 删除
删除第1到4行::1,4d
(5)y:复制
复制第1到4行::1,4y,然后使用p粘贴
(6)s:替换
如图:
想要替换前5行开头的#,应该这样:
:1,5s /^#/ / (后面的是空)
(7):set nohlsearch 关闭高亮显示,对当前shell有效
9、窗口属性的定义:
末行模式
(1):set nu:输出行号
(2):set nonu
(3):set ai 自动缩进(其他发行版本)
(4):set shiftwidth=4 设置自动缩进空格数为4(ubuntu系统)
(5):set softabstop=4 设置制表符宽度为4
(6):set ic 查找时不考虑大小写
(7):set noic 查找时考虑大小写
注意事项:vim编辑器不能同时打开两次或以上,否则会出现交换文件。
作业:
有难度
1:统计出系统内安装的所有软件包的数量
2:找出CPU信息文本中开头为”cpu”(大小写不限)字符的行
3:要求显示/proc/meminfo文件中以B开头的行,以kb(大小写不限)结尾,中间任意长度的任意字符的行。
4:要求在/etc/目录下找到文件类型为普通文件并且文件名为sudoers的文件,然后查看文本文件内生效的配置信息有多少行?(这是一条命令)
5:要求找出系统程序用户UID最大的五位用户,并打印输出至屏幕(只打印用户名)
6:在/etc/fstab找出下出现了字符”ext4”的行,并将找到的行的所有数据信息中的小写字母转换为大写字母,打印输出至屏幕
7:复制/etc/fstab到root家目录,将属主属组更改为当前的普通用户,然后在vi编辑器内将全部的内容进行复制一遍,放在下面。
查找到字符串“even”,然后通过VI编辑器的末行模式将第一行到第六行注释全部取消。再移动到第8行,将当前行以下内容(包括当前行)全部加上注释。
10 yy
p
/even
:1,6s/^#/ /
8G
:.,$s/^/#/
8:复制1-3行到最后,然后将此文件中的6-11行删除。
末行模式::1,3y
编辑模式:
G到底
P粘贴在下面
末行模式:
:6,11d