简述
主要记录一些进阶内容。例如文本搜索命令grep,文本处理命令sed/awk,软件安装卸载,vim的高级配置等。
软件卸载及安装
RPM:RedHat Package Manager,红帽软件包管理器,通过一套本地数据库提供了一种更简单的软件安装管理方式。总共有两种类型,预编译包和源码包。预编译包只要在特定kernel版本下预先编译好程序(使用大多数常用编译参数),并将所需要的文件整体打包,在新主机上安装时,将文件直接复制到特定目录下即可;而二进制包需要自定义编译参数,需要先执行congfigure指令。
常用参数:
1 | #安装软件 |
yum:Yellow dog Updater Modified,一个基于RPM的shell前端包管理器,能够从指定服务器上自动下载并安装或者更新软件、删除软件,最大的好处是自动解决依赖关系,RedHat和CentOS的版本为5以上的都会默认安装yum。
1 | yum [options] [command] [package] |
默认情况下RedHat会因为未注册RHN而无法使用yum,删除/etc/yum.repos.d/rhel-debuginfo.repo,创建一个新的Centos-Base.repo文件,输入以下内容,注意,不同版本的内容可能不一样:
1 | [base] |
如果通过更改以上更改软件源的方式还是不行,那么需要使用rpm卸载原来的yum工具,然后重新安装CentOS的yum工具:rpm -ivh rpm-url \ rpm-url\
。
文本搜索命令grep
grep:Global search Regular Expression and Print out the line。Linux下非常强大的基于行的正则文本搜索工具,区分大小写。
常用参数:
1 | #不区分大小写 |
常用正则:
- . 匹配换行符以外的任意一个字符
- * 匹配前一个字符0次或任意多次
- \{n,m\} 匹配字符的重复次数至少n次,最多m次
- \{n,\} 匹配字符的重复次数至少n次
- \{n\} 匹配字符重复次数为n次
- ^ 匹配开头字符,出现在方括号中即是取反的意思
- $ 匹配结束字符
- [] 匹配方括号内出现的任意字符
- \ 转义字符,用于将某语义转义为其他语义,例如^代表匹配开头,那么\^表示匹配^字符
- \<\> 匹配左右边界
- \d 匹配一个数字
- \b 匹配单词边界
- \B 匹配非单词边界
- \w 匹配数字、字母、下划线。等价于[0-9A-Za-z]
- \W 匹配非字母、非数字、非下划线
- \n 匹配一个换行符
- \r 匹配一个回车符
- \t 匹配一个制表符
- \f 匹配一个换页符
- \s 匹配任何空白字符
- \S 匹配任何非空白字符
扩展正则表达(需要使用egrep命令):
- ? 匹配前一个字符0或者1次
- + 匹配前一个字符1次或以上
- | 或
- () 配合|,(A|B|C),枚举一系列可能匹配的字符
- {} 匹配所有大括号内包含的以都好隔开的字符
- ! 常和[]一起用,取反
常用命令:
1 | grep '^good' test.txt #匹配test.txt文件中以good开头的行 |
文本处理工具sed
sed:stream editor是一种非交互式的流编辑器,通过多种转换修改流经它的文本。默认情况下,sed并不会改变源文件本身,而只是对流经sed命令的文本进行修改,并将修改后的结果打印到标准输出中,但是-i选项会修改源文件。
使用场景:
- 常规编辑器编辑困难的文本。
- 过于庞大的文本,比如vi一个几百兆的文件。
- 有规律的文本修改,加快文本处理速度,比如全文替换。
用法:sed [options] 'command' file
#options是set可以接收的参数
#command是sed的命令集(一共有25个)
#使用-e参数和分号链接多编辑命令
#-e的作用是将下一个字符串解析为sed编辑命令
#将全局的this替换为That,将全局的line替换为LINE:sed -e 's/this/That/g' -e 's/line/LINE/g' 1.txt
#上个命令等同于:sed 's/this/That/g ; s/line/LINE/g' 1.txt
删除
1 | #删除第一行 |
替换
1 | #默认情况下只替换第一次匹配到的内容 |
字符转换
1 | #将file中的O转换为N,L转换为E,D转换为W,转换字符和被转换字符长度要相等,否则无法执行 |
插入
1 | #在第二行之前插入Insert |
读文件
1 | #将/etc/passwd中的内容读出放到1.txt空行之后 |
写文件
1 | #将1.txt文件里的第1,2行保存到output文件里 |
sed脚本
新建一个sed.rules文件,内容如下:
1 | #替换所有this为that |
使用-f参数指定脚本应用于1.txt:sed -f sed.rules 1.txt
高级替换
几种空间的概念:
模式空间:当前输入行的缓冲区;
缓存空间(存储空间):sed处理完的流的缓冲区。
- H:将模式空间的内容追加到缓存空间
- h:将模式空间的内容复制到存储空间,覆盖原有存储空间
- G:将存储空间的内容追加到模式空间
- g:将存储空间的内容复制到模式空间
1 | #读取匹配行的下一行(命令n代表下一行,参数-n代表处理过的行),再使用n命令后的编辑指令来处理该行 |
sed常用命令:
sed命令 | 作用 |
---|---|
a | 在匹配行后面加入文本 |
c | 字符转换 |
d | 删除行 |
D | 删除第一行 |
i | 在匹配行之前加入文本 |
h | 复制模式空间内容到存储空间 |
H | 将模式空间的内容追加到缓存空间 |
g | 将存储空间的内容复制到模式空间 |
G | 将存储空间的内容追加到模式空间 |
n | 读取下一个输入行,用下一个命令处理新的行 |
N | 追加下一个输入行到模式空间并在二者间插入新行 |
p | 打印匹配的行 |
P | 打印匹配的第一行 |
q | 退出sed |
r | 从外部文件中读取文本 |
w | 追加读写文件 |
! | 匹配取反 |
s/old/new | 用new替换正则表达式old |
= | 打印当前行号 |
sed常用参数:
sed参数 | 作用 |
---|---|
-e | 多条件编辑 |
-h | 帮助信息 |
-n | 不输出不匹配的行 |
-f | 指定sed脚本 |
-V | 版本信息 |
-i | 修改源文件 |
文本处理工具awk
awk是基于列的文本处理工具,能够处理结构化的文件,也就是说都是由各种单词和空白字符组成的,这里的空白字符包括空格,制表符,以及连续的空格和制表符等。每个非空白的部分叫做域。$1表示第一个域,$0表示全部域。
格式以及说明:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
常用命令和功能:
1 | 打印指定域: |
vim配置优化
1 | if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" |
相关配置文件 | 功能描述 |
---|---|
.viminfo | 用户使用vim的操作历史 |
.vimrc | 当前用户vim的配置文件 |
/etc/vimrc | 系统全局vim配置文件 |
/usr/share/vim/vim74/colors/ | 配色模板文件存放路径 |
vim 常用指令:
vim有三个模式,普通模式(即用vim刚刚打开某个文件时的模式);编辑模式(按i或o键进入);命令行模式(也叫末行模式,通常是以”:”开头,可以输入命令)
[普通模式]
- G:光标移动道最后一行
- gg:光标移动到第一行,等价于1gg或1G
- 0:数字0,表示将光标从所在位置移动到当前行的开头
- $:将光标所在位置移动当前行的结尾
- n
:数字键+回车,表示将光标从当前位置向下移动n行 - ngg:将光标移动到n行
- H:将光标移动到当前窗口的第一行
- M:将光标移动到当前窗口的中间行
- L:将光标移动到当前窗口的最后一行
- h:和左方向键一样,光标左移一格
- j:下移一格
- k:上移一格
- l:右移一格
- /string:从光标位置开始向下搜索string
- ?string:从光标开始向上搜索string
- n:从光标位置开始向上重复前一个搜索的动作
- N:从光标位置开始向下重复前一个搜索的动作
- :g/A/s//B/g:把符合A的内容全部替换为B,斜线为分隔符,可以用@,#等替代
- :%/s/A/B/g:把符合A的内容全部替换为B,斜线为分隔符,可以用@,#等替代
- n1,n2s/A/B/gc:n1,n2为数字,表示在第n1行和第n2行间寻找A,且用B替换
- Yy:复制光标所在行
- nyy:复制从光标开始往下的n行
- P/p:p表示将已复制的数据粘贴到光标的下一行,P表示上一行
- dd:删除光标所在行
- ndd:删除从光标处开始的n行
- u:回复前一个执行过的操作
- .:重复前一个执行过的动作
[编辑模式]
- i:在当前光标所在处插入文字
- a:在当前光标所在位置的下一个字符出插入文字
- I:在当前所在行的行首第一个非空格字符处插入,和A相反
- A:在当前所在行的行尾最后一个字符处插入,和I相反
- O:在当前所在行的上一行处插入新的一行
- o:在当前所在行的下一行处插入新行
- ESC:退出编辑模式,回道普通模式
[命令行模式]
- :wq:退出并保存
- :wq!:退出并强制保存
- :q!:强制退出不保存
- :n1,n2, w filename:n1和n2为数字,表示将n1行到n2行的内容保存成filename这个文件
- :n1,n2 co n3:n1和n2为数字,表示将n1行到n2行的内容复制到n3位置下
- :n1,n2 m n3:表示将n1行到n2行内容挪到n3位置下
- :!command:暂时离开vim,到命令行里执行command命令。例如!ls /etc,此时没有退出vim
- :set nu:显示行号
- :set none:取消行号
- :vs filename:垂直分屏显示,同时显示当前文件和filename对应文件的内容
- :sp filename:水平分屏显示,同时显示当前文件和filename对应文件的内容
- :1+#+ESC:在可视块模式下(ctrl+v),一次性注释所选的多行
- :n1,n2s/#/ /gc:与上一句相反,取消注释
- Del:在可视块模式下,一次性删除所选内容
- r:在可视块模式下,一次性替换所选内容
拓展:
- ctrl+w+n:新建分屏
- ctrl+w+s:新建水平分屏
- ctrl+w+v:新建垂直分屏
- vim -On file1 file2…
- vim -on file1 file2 …
- 大O表示垂直分屏,小o表示水平分屏
- ctrl+w:切换分屏
- :only或者ctrl+w+o:关闭其他分屏
- ctrl+w+c:关闭当前分屏