Linux的文本处理三剑客
> grep:文本过滤(模式:pattern)工具
> grep, egrep, fgrep(不支持正则表达式搜索)
> sed:stream editor,文本编辑工具
> awk:Linux上的实现gawk,文本报告生成器
– ### grep
作用是根据“pattern”对目标文件进行搜索,并且显示匹配到的行
这就是一个简单的脚本脚本的用途是显示hello
grep分三种
> 1:fgerp不支持正则表达式,但是搜索速度极快
> 2:gerp支持正则表达式
> 3:egerp支持扩展的正则表达式 有
用法:grep [OPTIONS] PATTERN [FILE…]
gerp常用的选项
-color=auto: 对匹配到的文本着色显示
-v: 显示不被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
正则表达式的元字符有
“`
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
“`
匹配次数有
“`
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
“`
位置锚定的字符有
“`
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词
“`
分组
“`
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
“`
– #### 扩展的正则表达式和基本的正则表达式用法基本一样,但比基本的正则表达式方便,用法是在正则表达式的基础上去掉转义符
shell脚本基础
程序的编程风格分为两类
> 1:过程式:以指令为中心,数据服务于数据
> 2:对象式:以数据为中心,指令服务于数据
高级语言大致分为两种
> 编译:高级语言–>编译器–>目标代码
java,C#
> 解释:高级语言–>解释器–>机器代码
shell, perl, python
– ### shell脚本:
包含一些命令或声明,并符合一定格式的文本文件
> 格式要求:在shell脚本中
> 首行需要写shebang机制
> shebang写做#!,#!的作用是告诉cpu此程序是什么机制
示例:#!的写法
> #!/bin/bash
> #!/usr/bin/python
> #!/usr/bin/perl
> shell脚本的用途有:
> 自动化常用命令
> 执行系统管理和故障排除
> 创建简单的应用程序
> 处理文本或文件
简单的脚本可以由简单的命令组合而成。
脚本的基本结构
> #!SHEBANG
> CONFIGURATION_VARIABLES
> FUNCTION_DEFINITIONS
> MAIN_CODE
示例
“`
#!/bin/bash
#—————————
# my first script
# owner :zhangxiao
#—————————
echo “hello”
“`
– vim的基本用法
vim可以打开编辑文件
如果后边跟的名字的文件不存在则创建该空文件
“`
vim +(n) filename: 打开时光标处于文件的第n行
vim +/pattren filename:打开时光标处于pattern所匹配的位置
“`
– vim模式转换
“`
输入模式==》命令模式
esc
命令模式==》末行模式
:
末行模式==》命令模式
esc
“`
– 命令模式==》输入模式
“`
i:光标所在的前面插入
I:光标所在的行首
a:光标所在的后面
A:光标所在行的行尾
o:光标所在行的下方开一个新行
O:光标所在行的上方开一个新行
“`
– 输入模式下可以随意输入字符
末行模式下的基本操作
“`
:q 退出
:q!强行退出
:w 保存
:wq 保存退出
:x 保存退出
:w /path保存在指定文件中
“`
– 光标跳转:
“`
h左
j下
k上
l右
“`
备注(n)h/j/k/l 向方向跳n个字符
“`
w一个单词一个单词的跳转
b和w同意
e一个单词一个单词反方向跳转
“`
备注(n)w/e/b向方向跳转几个单词
“`
^ 行首(非空的)
0 行首(绝对)
$ 行尾
“`
– 行跳转
“`
(n)G 跳转到文件的第n行
G 跳转到文件的最后一行
1G或gg跳转到文件的首行
“`
段落间的移动
“`
{ 向前面段落移动
} 向后面段落移动
“`
命令模式下vim的编辑
删除命令
“`
x:删除光标处字符
(n)x:删除光标处几个字符
dd:删除光标所在一整行
(n)dd:删除光标所在的几行
“`
粘贴命令
“`
p:缓冲区若存的为整行则粘贴时在光标的行的下方开一行
若存的不是整行则在光标的后面
P(大写):与小写P相反
“`
复制命令
“`
y:工作机制和d相同
“`
改变命令
“`
c:同d
但是执行完c后会直接转入输入模式
“`
替换命令
“`
r:替换字符
“`
可视化模式:类似于win模式的选中
“`
V:直接圈整行
v:按字符选定光标所在的位置
备注v经常结合dyc使用
“`
撤销命令
u:撤销一次
(n)u:撤销几次
Ctrl + r 反撤销
U:直接撤销至操作前
– ### 脚本编程入门
–
– 变量的种类
“`
本地变量:生效范围为当前bash
环境变量:生效范围是当前bash及其子进程
命令 或export生命环境变量
局部变量:生效范围为当前bash中的某个代码片段
位置变量:一般用$1,$2..代表,用于脚本在脚本调用中通过命令行传递给他的参数
特殊变量:类似$?,$0等在bash中表示特殊意义的变量
“`
– 变量的赋值方式:name=‘value’
> 1.可以是字符 name=“username”
> 2.可以是变量引用 name=“$username” 3.可以是命令的执行结果 name=`CMD `
> 或者name=$(CMD)
> 变量引用方式:${name} 大多数情况下可以省略
> {当变量名和后边的内容不容易分清时,需要加花括号}
– 查看变量
> set查看所有变量
> unset name 取消本地变量
– 环境变量的声明
> export a=name 声明环境变量a
> dclear -x name=abc
– 显示环境变量
“`
export
env
printenv
“`
– 变量命名法则
“`
1 不能使用程序中的保留字
2 变量名只能使用数字,字母,下划线且不能使用数字揩油
3 尽量做到见名知意。
4 可以用驼峰法则
“`
只读变量不能被改变值不能被终止只能等bash结束后自动消失
位置变量
用于脚本在脚本调用中通过命令行传递给他的参数
$1,$2,$3..对应调用的第1,2,个命令
– bash的配置文件
“`
1.全局配置:/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2.个人配置:home/.bash_profile
/.bashrc
“`
profile类的:是为交互式shell提供配置
“`
使用su – 登录的
功用:用于定义环境变量
命令运行或脚本
读取顺序:/etc/profile–> /etc/profile.d/*.sh–> ~/.bashrc_profile–>~/.bashrc–>/etc/bashrc
“`
后面的会覆盖前面的内容,所以靠后的生效
bashrc类的::为非交互式登录提供配置
“`
1使用 su 登录的
2图形界面打开终端
3执行脚本时
功用:定义别名
定义本地变量
读取顺序 ~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh
“`
– #### 算数运算
“`
1.let var=算数表达式
2.var=$[算数表达式]
3.var=$((算数表达式))
4.var=$(expr arg1 arg2 arg3 …)
“`
条件判断
“`
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
“`
备注:中括号两边必须有空格
数值判断
“`
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
“`
字符串判断
==:等于
> :大于(ASICI)
<:小于(ASICA)
!=:不等于
=~:是否能被PATTERN匹配
-z:是否为空
-n:是否不空
备注:字符串比较式都用该用引号
shell自定义退出状态码
> exit [n] 脚本中一旦遇到exit则脚本立即终止,终止状态取决于脚本后面的数字
> 如果未指定状态码,则脚本退出状态码取决于最后一个参数执行成功与否
存在性测试
“`
-a FILE:同-e
-e FILE: 文件存在性测试,存在为真,否则为假
“`
存在性及类别测试
“`
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
“`
文件权限测试:
“`
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
“`
文件特殊权限测试:
“`
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
“`
### 文件查找
– #### locate
非实时查找,也叫数据库查找基于(/var/lib/locatedb)
> 默认大概每天更新一次,如果想用locate实时查找,可以用命令updatedb升级数据库
备注:如果在白天线上服务器比较忙最好不要用updatadb 命令。(索引构建过程需要历遍整个根文件消耗资源比较大,会耗费时间)
> 优点:速度快,不占用内存
> 缺点:常更新的文件不一定会搜索得到
语法:lacate KEYWORD
会显示所有带KEYWORD的文件或者目录(包括路径中带有KEYRORD的)
示例
“`
[root@zhangxiao data]# locate /root/87*
/root/87_a
/root/87_jitu
/root/87scp.sh
[root@zhangxiao data]#
“`
find
实时查找
优点:比较准确
缺点:速度略慢会占用内存
语法:find [查找路径] [查找条件] [处理动作]
查找路径:指定具体的目录路径,默认为当前路径
查找条件:指定查找的标准,可以以文件名、大小、类型、权限等
处理动作:对符合条件的文件做什么操作;默认输出至屏幕
默认递归 查看文件夹中的文件
1.-name “FILENAME”,支持使用通配符
“`
示例
[root@zhangxiao etc]# find /root/ -name “87*”
/root/87_a
/root/87scp.sh
/root/87_jitu
[root@zhangxiao etc]#
“`
2.-iname “FILENAME”查找文件名称不区分大小写
“`
示例
[root@zhangxiao ~]# touch IiIiU
[root@zhangxiao ~]# find /root -iname ii*
/root/IiIiU
[root@zhangxiao ~]#
“`
3.regex “PATTERN” 以PATTERN匹配整个文件路径查找字符串而不仅仅是文件名
“`
示例
[root@zhangxiao etc]# find /etc -regex “/etc/i.*”
/etc/inittab
/etc/init.conf
/etc/idmapd.conf
/etc/inputrc
/etc/init/tty.conf
/etc/init/ck-log-system-start.conf
/etc/init/rcS.conf
/etc/init/splash-manager.conf
/etc/init/prefdm.conf
/etc/init/control-alt-delete.conf
/etc/init/start-ttys.conf
/etc/init.d
[root@zhangxiao etc]#
“`
根据属主属组查找
1. -user USERNAME以属主为username的文件
“`
示例
[root@zhangxiao data]# find /data -user “zhangxiao”
/data/dir11
/data/dir11/fa1
/data/dir11/passwd
/data/ff2
/data/dd23
/data/23
[root@zhangxiao data]#
“`
2. -group GROUPNAME 以属组为指定组的文件
“`
示例
[root@zhangxiao data]# find /data -group xiaoxiao
/data/fa1
/data/23
[root@zhangxiao data]#
“`
3. -uid:查找属主为指定UID的文件
“`
示例
[root@zhangxiao data]# find /data -uid “0”
/data
/data/testdir1
/data/testdir1/fa1
/data/testdir1/passwd
/data/testdi1
/data/lost+found
/data/passwd
/data/test1
/data/test1/passwd
[root@zhangxiao data]#
“`
4. -gid:查找属组为指定GID的文件
“`
示例
[root@zhangxiao data]# find /data -gid “500”
/data/dir11
/data/dir11/fa1
/data/dir11/passwd
/data/ff2
/data/dd23
[root@zhangxiao data]
“`
5. -nouser: 查找没有属主的文件
“`
[root@zhangxiao xiaoxiao]# find /data -nouser
/data/f33
/data/f30
/data/f32
/data/f31
[root@zhangxiao xiaoxiao]#
“`
6. -nogroup:查找没有属组的文件
“`
根据文件类型查找
“`
1. -type
f:文件
d:目录
“`
示例
[zhangxiao@zhangxiao ~]$find /data -type “d”
/data
/data/dir11
/data/testdir1
/data/testdi1
/data/lost+found
find: `/data/lost+found’: Permission denied
/data/test1
[zhangxiao@zhangxiao ~]$
“`
l:符号链接
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
“`
组合条件
“`
-a :与
“`
[root@zhangxiao zhangxiao]# find /data -name “f*” -a -user “zhangxiao”
/data/dir11/fa1
/data/fa1
/data/ff2
[root@zhangxiao zhangxiao]#
“`
-o :或
-not,-! :非
!A -a !B= !(A -o B)
!A -o !B= !(A -a B)
“`
示例
[root@zhangxiao firmware]# find /etc -size “+1M” -type “f”
/etc/selinux/targeted/policy/policy.24
/etc/selinux/targeted/modules/active/policy.kern
/etc/gconf/gconf.xml.defaults/%gconf-tree.xml
[root@zhangxiao firmware]#
“`
根据文件大小查找
“`
1. -size [+|-]
常用单位:K、M、G
(-size 3k:是指大于等于2K到3K的文件)
(-size -3k:0-2K的文件)
(-size +3k:大于3K的文件)
“`
以时间戳为单位
以天为单位的
“`
-atime
-ctime
-mtime
(-atime 3大于等于3天不到4天 )
(-atime +3 四天之前)
(-atime -3 不到三天
“`
)
以分钟为单位
“`
-amin
-cmin
-mmin
“`
按权限查找
“`
-perm 222精确匹配222
-perm 【+|-】mode
在此种情况下0表示不关心,7包括1、2、4.
-perm +222 (加号表示或者的关系)
-perm -222
(减号表示每一类对象都需要有这个权限)
“`
-maxdepth:查找的最大层级
-mindepth:查找的最小层级
示例
“`
[root@zhangxiao zhangxiao]# find /data -maxdepth “1” -size “2k” -ls
12 4 -rw-r–r– 1 root root 1682 Mar 31 11:18 /data/passwd
[root@zhangxiao zhangxiao]#
“`
处理动作:
“`
-print:默认的处理动作。输出到屏幕
-ls:对查到的文件执行ll命令
-delete:删除查找到的文件
-fls:查找到的文件信息以长格式保存在指定的目录中
-ok CMD {}\;:对查找到的每一个文件执行CMD,执行前交互式要求用户确认
-exec CMD {}\;:批量执行前面的CMD不需要确认
“`
find传递查找到的文件至后边指定的命令是有些命令不能接受这么多参数此时 执行命令就会失败,我们可以用一个方法解决
“`
find | xargs CMD
指的是一条一条命令传给CMD
“`
find常配合cpio使用
cpio
“`
功能:复制文件从或到归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
选项
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
“`
压缩,归档工具
1.gzip:只能压缩文件不能压缩目录
gzip filename :压缩文件
“`
示例
[root@zhangxiao zhangxiao]# gzip PAAA
[root@zhangxiao zhangxiao]# ls PAAA.gz
PAAA.gz
[root@zhangxiao zhangxiao]#
“`
-d:代表解压缩,和unzip效果一样
“`
示例
[root@zhangxiao zhangxiao]# gzip -d PAAA.gz
[root@zhangxiao zhangxiao]# ls
a.out Downloads hello.sh MUSIC per.sh pwa1 test1
Desktop excyte.sh helloword PAAA Pictures script.log txt.txt
Documents haha Music paBB Public Templates Videos
[root@zhangxiao zhangxiao]#
“`
-c:filename > filename.gz 保留源文件
-9:以9倍压缩比压缩(1-9)都可以
gungzip filename:解压缩文件
zxat:不解压直接查看文本文件内容
2.bz2:只能压缩文件不能压缩目录
bzip filemane :压缩文件
-d:解压缩
-k:压缩直接保留文件
“`
示例
[root@zhangxiao zhangxiao]# bzip2 -k paBB
[root@zhangxiao zhangxiao]# ls
a.out Downloads hello.sh MUSIC paBB.bz2 Public Templates Videos
Desktop excyte.sh helloword PAAA per.sh pwa1 test1
Documents haha Music paBB Pictures script.log txt.txt
[root@zhangxiao zhangxiao]#
“`
-q:静默过程
-9:(1-9)几倍压缩比
bunzip2 :解压缩
bzcat:不解压直接查看文件
3.xz:压缩文件
xz filename 压缩文件
-d:代表解压缩,和unzip效果一样
-k:保留源文件
-9:以9倍压缩比压缩(1-9)都可以
xzcat:不解压直接查看文件
#### tar
归档文件
“`
1.创建归档
tar -c -f /PATH/TO/SOMEFILE.tar file…
2.查看归档文件中的列表
tar -t -f PATH/TO/SOMEFILE.tar
3.展开归档
tar -x -f PATH/TO/SOMEFILE.tar
tar -x -f PATH/TO/SOMEFILE.tar -C \PATH/TO/DIR(归档到指定文件)
“`
归档的同时压缩
-J:xz -j:bzip2 -z:gzip
## sed
sed:行编辑器,逐行处理
语法:sed:[option]… ‘script’ inputfile
sed /地址定界/命令 文件
常用选项
“`
-n :静默模式,不输出模式中的内容弄到屏幕
-e :多点编辑功能
-f :/PATH/TO/SCRIPT_FILE从指定文件中读取编辑脚本
-r :扩展正则表达式
-i:修改原文件
“`
地址定界
“`
(1):不给地址:对全文进行处理
(2):单地址
#:第几行
/PATTERN/:此模式匹配的每一行
(3)地址范围
#,#:第几行到第几行
#,+#:第几行到加几行
/PATTERN1/,/PATTERN2/:匹配的行到匹配的行
#,/PATTERN/
“`
编辑命令
“`
d:删除地址范围的内容
p:输出到屏幕上
a \’内容’:在每一个符合条件的行后加入内容
i \‘内容’:每一行前面插入内容
c \’内容‘:替换所在的行为内容
w /PATH/FILENAME:匹配的内容另存为文件为指定路径文件
r /PATH/FILENAME:把指定文件中的内容读取到匹配的后面
=:为模式空间中的行打印行号
!:取反条件
s////:查找替换,支持使用其他分隔符如s@@@\s###
替换标记
g:行内全局替换
p:显示替换的行
w /PATH/TO/SOMEFILE将替换成功的结果保存到文件中-
“`
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96072