关于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可以查看目前的后台进程,每个进程都有一个编号叫pidexport可以传递变量。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]...

    -dDELIMITER: 指明分隔符,默认tab

    -fFILEDS:第几列

    #: 第#个字段

    ·#,#[,#]·:离散的多个字段,例如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和文本处理的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

shell脚本简介及常用文本编辑命令

Shell脚本处理文本换行问题

Linux Shell 文本处理工具集锦

Shell 文本处理工具

在片段中添加 Viewpager