关于shell和文本处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于shell和文本处理相关的知识,希望对你有一定的参考价值。
shell脚本 在正常生产环境中,肯定会有一些重复而简单的工作,那么这个时候我们就可以利用一些小脚本来完成这些工作,那就是shell了。shell的用途就是自动化常用命令,执行系统管理和腹胀排错,处理文件或文本;格式要求,由于现在用的shell是bash,所以在脚本开始第一行要求格式就是#!/bin/bash
。像其它的还会有一些#!/bin/perl
,#!/bin/python
。脚本完成后可以运行bash -n
脚本 检验一下脚本是否成功; 也可以实用bash -x
脚本,这样是逐步检查脚本的检验。
在shell
中,不能使用保留字和命令之类的做变量,不能使用数字和下划线开头,最好使用是英语单词定义变量,日后好找。统一命名规则驼峰命名法,就是单词的名字首字母大写。如果使用echo显示变量,变量前必须加$ ,不然echo
不能识别。echo
变量是非常局限的,可以通过pstree -p
可以查看目前的后台进程,每个进程都有一个编号叫pid
。export
可以传递变量。echo $BASHPID
可以查看当前的变量, echo $PPID
可以查看父变量。可以通过 unset name
删除变量。通过env
可以查看目前所有的变量。如果想使用一次行的变量,可以使用小括号,小括号会开启子进程但是只有一次,花括号不会。
短路与 只要有一个cmd是假的 那么结果就是假的,用&&
表示:cmd1 && cmd2
其中如果第一个命令是假的,那么就不会执行第二个命令,如果第一个命令正确,就会执行第二个命令,第二个命令如果正确,结果就正确,反之则结果为假。短路或 cmd1 || cmd2
:如果cmd1正确,那么就不执行第二个,结果为真。如果cmd1失败 那么就执行cmd2.
还有一些比较数值大小的需要用到数值测试:-gt
是否大于: -ge
是否大于等于: -eq
是否等于: -ne
是否不等于: -lt
是否小于:-le
是否小于等于
关于cat
一些选项,cat是我们常用的命令,相当于echo了。cat正常是不显示空格结尾的文本,cat -E file
可以。cat -nE file
可以查看前面的行符。cat -nEs file
可以把多个连续的空行压缩为一个。cat -bE file
显示行号但是不显示空白行的行号。cat -A file
可以查看所有控制符。总体来说cat -E file
可以查看文件行尾的标识符,脚本中如果有些错误,可能就是这了。-V显示不可显示的符号,-A最全面。cat -n file
可以显示行号,但是cat -b file
不显示空行的行号,如果有多空行可以实用cat -ns file
把多空行压缩成一行。
和cat一样的还有tac和rev,但是并没有cat那么常用。tac 整行反向显示文本 ; rev 整列反向显示文本。
那么就来grep了
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep ‘$USER‘ /etc/passwd
grep whoami /etc/passwd。--color=auto
: 对匹配到的文本着色显示
-v
: 显示不被pattern匹配到的
-i
: 忽略字符大小写
-n
:显示匹配的行号
-c
: 统计匹配的行数
-o
: 仅显示匹配到的字符串(grep -o 其中的-o表示只显示被选中的,其它的不显示。只适用于取单词
)
-q
: 静默模式,不输出任何信息
-A #
: after, 后#行
-B #
: before, 前#行
-C #
:context, 前后各#行
-e
:实现多个选项间的逻辑or关
grep –e ‘cat ’ -e ‘dog’ file
-w
:匹配整个单词
-E
:使用ERE
-F
:相当于fgrep,不支持正则表达式
-f file
: 根据模式文件处理
基本正则表达式元字符
字符匹配:
. 匹配任意单个字符
[]
匹配指定范围内的任意单个字符,示例:[abcd] [0-9] [a-z] [a-zA-Z]
[^]
匹配指定范围外的任意单个字符
[: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\>
匹配整个单词
在正则表达式中,.表示任意一个字符;[]
中表示其中任意一个字符;[^]表示不是i中一个字符;a*表示任意个a,重复次数不限制那个,也可以是零,但是a\?
表示a可有可无,也就是最多一次。a\+
表示最少有一个a; a\{10\}
表示10一下个a;a\{10,20\}
表示10到20个a; a\{,20\}
表示最多20个a; a\{10,\}
表示最少十个a;
关于head和tail的一些选项
head [OPTION]... [FILE]...
-c #
指定获取前#字节
-n #
指定获取前#行
-#
指定行数;正常来说,可以直接使用head -#,前面不必叫-n,效果是一样的。
tail [OPTION]... [FILE]...
-c #
指定获取后#字节
-n #
指定获取后#行
-#
同上
-f
跟踪显示文件fd新追加的内容,常用日志监控
相当于 --follow=descriptor
;tail -f
可以跟踪新增,taif -f /var/log/message查看设备日志.
-F
跟踪文件名,相当于--follow=name --retry
;tail默认提取最后10行,tail -f file 可以实时追踪文件(文件描述符)不退出。tail -F file可以一直追踪文件名,无论删除与否。
关于cut
cut [OPTION]... [FILE]...
-d
DELIMITER: 指明分隔符,默认tab
-f
FILEDS:第几列
#
: 第#个字段
·#,#[,#]
·:离散的多个字段,例如1,3,6
#-#
:连续的多个字段, 例如1-6;混合使用:1-3,7
关于wc
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
wc story.txt
39 237 1901 story.txt
行数 字数 字节数
常用选项
-l
只计数行数
-w
只计数单词总数
-c
只计数字节总数
-m
只计数字符总数
-L
显示文件中最长行的长度
sort
把整理过的文本显示在STDOUT,不改变原始文件
sort [options] file(s)
常用选项
-r
执行反方向(由上至下)整理
-R
随机排序
-n
执行按数字大小整理
-f
选项忽略(fold)字符串中的字符大小写
-u
选项(独特,unique)删除输出中的重复行
-t c
选项使用c做为字段界定符
-k X
选项按照使用c字符分隔的X列来整理能够使用多次
uniq
uniq
命令:从输入中删除前后相接的重复的行
uniq [OPTION]... [FILE]...
-c
: 显示每行重复出现的次数
-d
: 仅显示重复过的行
-u
: 仅显示不曾重复的行(注:连续且完全相同方为重复)
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
uniq 默认作用合并相邻的重复行;=sort -u 合并相邻的重复行;
文件的查找与压缩
find
find是实时查找工具,通过遍历指定路径完成文件查找,工作特点:查找速度略慢;精确查找;实时查找; 可能只搜索用户具备读取和执行权限的目录,它的语法是
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;
默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
搜索层级:
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度
先处理目录内的文件,再处理目录
-depth
根据文件名和inode查找:
-name "文件名称":支持使用glob-name "文件名称":支持使用glob
*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找
-type TYPE
? f: 普通文件
? d: 目录文件
? l: 符号链接文件
? s:套接字文件
? b: 块设备文件
? c: 字符设备文件
? p: 管道文件
空文件或目录
-empty
find /app -type d -empty
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
根据时间戳:
以“天”为单位
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+
从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
处理动作-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性
传递给后面的命令
xargs
参数替换xargs
由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了
xargs命令
xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符
或回车符将 stdin 的数据分隔成为arguments
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
示例:
ls f* |xargs rm
find /sbin/ -perm +700 |ls -l 这个命令是错误的
find /bin/ -perm /7000 | xargs ls -l 查找有特殊权限的文件
find /bin/ -perm -7000 | xargs ls -l 此命令和上面有何区别?
find和xargs格式:find | xargs COMMAND
gzip gunzip
通常我们在网络上面上传或者下载一个比较大的文件时,会对文件或者文件夹进行打包压缩处理以便更快速的工作效率,我们会使用一下小工具来对文件或者文件夹进行打包压缩和解压缩。
gzip [OPTION]... FILE ...
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
gunzip file.gz 解压缩
zcat file.gz 不显式解压缩的前提下查看文本文件内容
示例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.gz
tar
(1) 创建归档
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至归档: 注:不支持对压缩文件追加
tar -r -f /PATH/FILE.tar FILE...
(3) 查看归档文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展开归档
tar -x -f /PATH/FILE.tar
tar -x -f /PATH/FILE.tar -C /PATH/
(5) 结合压缩工具实现:归档并压缩
-j: bzip2, -z: gzip, -J: xz
-exclude 排除文件
tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app
-T 选项指定输入文件
-X 选项指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
split:分割一个文件为多个文件,例如分割大的 tar 文件为多份小文件
split -b Size –d tar-file-name prefix-name
split -b 1M –d mybackup.tgz mybackup-parts
split -b 1M mybackup.tgz mybackup-parts
合并:
cat mybackup-parts* > mybackup.tar.gz
本期呢差不多就是这写内容,简单实用,如果想全部学会还是需要一些精力的。加油!
以上是关于关于shell和文本处理的主要内容,如果未能解决你的问题,请参考以下文章