1397535668 发表于 2018-8-19 07:01:44

shell编程基础之基本文本工具集合

一 shell简介:
1 描述
  Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
  Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
  Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
  shell环境
  shell和Java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行脚本的脚本解释器就可以了
  shell的种类众多有
  bourne shell(/ur/bin/sh 或 /bin/sh)
  nourne again shell(/bin/bash)
  c shell (/usr/bin/csh)
  K shell (/usr/bin/ksh)
  Shell for Root (/sbin/sh)
  我们目前关注的是bash,也就是bourne again shell
2 脚本简介
1 什么是脚本
  按照一定逻辑关系记录命令的文件
2 如何建立一个shell脚本
  A vinX.sh
  一般情况下脚本的结尾为".sh"这不是系统规定,是一种业界规范
  B
  #!/bin/bash 脚本头的写法,这是脚本使用的解释器,也就是默认脚本运行时开启的子shell,也可以使用此方式进行,可以使用相对路径 /usr/bin/envbash 通过env找到X程序并执行他,这样避免了脚本执行程序的路径错误
  C
  脚本的内容是命令和命令执行的逻辑关系组成

3 脚本的执行方式:
  1 chmod +x然后使用./脚本名称执行
  2 通过sh脚本名称执行

  4 脚本编写规范
  在vim/etc/vimrc 中书写

  按下F4出现以下结果,如此可以简略书写

二 命令集合
1 diff命令
  作用:找出两个文件中文本的差异并显示出来
  格式:diff [选项] 文件1文件2
  选项:
  -u:将两个文件中不同的文本放置在一起,并可以输出到另一个文件中
  -r:递归比较目录下的所有文件(比较目录时一定要使用)
  实例:

  比较结果有3中情况
  1 a 第一个文件需要增加输出的内容才能和第二个文件相同
  2 c 修改,其中包含增加和修改,或单独修改
  3 d 删除,第一个文件中删除不同之后和第二个文件相同
  4 i1234表示左边缺少i1234
  重定向到文件

  解析:@@代表一定范围
  "-" 代表第一个文件
  "+" 代表第二个文件
2 patch 打补丁
  1 查看是否安装
  # rpm -qa patch
  patch-2.7.1-8.el7.x86_64
  2 使用方式
  格式:
  patch [选项]原始文件< 补丁文件
  -b :备份原来的文件

  源文件以.orig结尾

3 cut 指令
  作用:cut是将文件中的每行所选的部分输出到标准输出流中的shell工具,是常用的接单文件处理命令之一,其是以每一行为一个处理对象
  格式:
  cut [选项][文件]
  主要参数:
  -b:以字节为单位进行获取
  -c:以字符为单位进行获取
  -d:指定分割符,以代替默认的tab
  -f:指定选项被分割后的项的位置
  -n:该选项和-b是合用的,-nb,意思是不用将多字节进行分割

  因为汉字是一个字两个字节,因此取一个字节取不出。
  实际应用:
  1 抓取网卡IP地址

  说明-d &quot; &quot;表示以空格为分割符,-f表示其IP地址在分割之后的相对位置为第十列。
  2 获取根目录下磁盘的使用量

4 Sort和uniq
1 总述
  sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。
2 sort 用途
  -n 表示按第一列进行排序

  -r 倒叙排列

  -u 去掉重复数字

  -o 输出文件重定向到自己
  -t 指定分割符
  -k 指定要排序的列

3 uniq 用于去重并结合sort
  -u 显示不重复的行
  -d 显示重复的行
  -c 每行显示并统计重复的次数


6 TEST 用法
1 总述
  test可用于测试表达式,支持测试的范围包括:字符串比较,算术比较,文件存在性、属性、类型等判断。例如,判断文件是否为空、文件是否存在、是否是目录、变量是否大于5、字符串是否等于&quot;longshuai&quot;、字符串是否为空等等。在shell中,几乎所有的判断都使用test实现。
  其中[]完全等价于test,只是写法不同。双中括号[[]]基本等价于[],它支持更多的条件表达式,还允许在双中括号内使用逻辑运算符&quot;&&&quot;、&quot;||&quot;、&quot;!&quot;和&quot;()&quot;,但这些使用单中括号都能实现,只不过多写几个单中括号而已。单中括号[]无法实现的功能是正则表达式匹配,而[[]]可以实现。因此,在能使用单中括号的情况下,无需考虑使用双中括号。
  和[ ] 相同 [ -e/mnt ] 前后都要有空格。否则会报错
2 条件表达式
  -efile    文件是否存在(exist)
  -f   file文件是否存在且为普通文件
  -dfile    文件是否存在且为块设备.其访问是随机访问
  -cfile    文件是否存在且为字符设备,其访问是顺序访问
  -bfile    文件是否存在且为目录
  -cfile    文件是否存在且为字符设备
  -S file文件是否存在且为套接字
  -p file文件是否存在且为管道文件FIFO
  -L file文件是否存在且为一个链接文件
  基本案例其中当条件成立时执行yes ,当条件不成立时执行no

3 文件属性检查。
  -r   file   文件是否存在且当前用户可读
  -w file 文件是否存在且当前用户可写
  -xfile    文件是否存在且当前用户可执行
  -ufile    文件是否存在接设置了SUID
  -gfile    文件是否存在且设置了SGID
  -kfile    文件是否存在且设置了粘贴位
  -sfile    文件是否存在且大小大于0字节,即检测文件是否为空白文件
  -N file 文件是否存在,且自上次read后是否被modify

4 两个文件之间比较;
  File1 -nt file2 判断file1是否比file2新
  File1 -ot file2 判断file1是否比file2旧
  File1 -ef file2 判断file1与file2是否为同一文件,主要意义在判定,两个文件是否均指向同一个分区上的同一个iNode

5 连个整数之间的判断,支持正负数,但不支持小数,
  int1 -eqint2两数值相等(equal)
  Int1 -neint2两数值不相等
  Int1 -gt   int2n1大于n2
  Int1 -lt    int2      N2大于N1
  Int1 -ge int2   N1大于等于N2
  Int1 -le   int2 N1 小于n2
6 判定字符串
  -z string   判断字符串是否为空,若string为空,则为true
  -n string   判断字符串是否为空,若为空,则为false
  String1=string2 String1是否和string2 相同,相同则返回true,&quot;==&quot;和&quot;=&quot;等价,但&quot;=&quot;可移植性更好
  String1 == string2
  Str1 !=str2 Str1 不等于str2是为真
  Str1> str2Str1大于str2为真
  Str1< str2Str1小于str2为真

7逻辑运算符
  -a 或&&      a && b   如果a 为正确执行,则执行第二条命令
  -o 或||         a||b   如果a 执行不正确,   则执行第二条命令
  !   对表达式取反
7 grep
1 总述
  grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
  Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
  其模式是由正则表达式、或者字符以及基本文本字符所编写的过滤条件
  正则表达式:由一类特殊字符集本文所编写成的模式,其中有些字符不代表字符的字面意思,而是表示控制或通配的功能
  分为两类:
  1 基本正则表达式(BRE):grep
  2 扩展正则表达式(RER):egrep   grep-E
  说起grep就得说一下基本正则表达式,因为grep是根据基本正则表达式来工作的。
  匹配任意单个字符:使用双括号表示弱引用,(意味着括号里面的中间如果有变量,则变量可以被执行,),使用单括号表示强引用,表示直接匹配每个字符。
2 常用功能
  选项
  -c   只输出匹配行的计数。
  -i   不区分大小写(只适用于单字符)。
  -h   查询多文件时不显示文件名。
  -l   查询多文件时只输出包含匹配字符的文件名。
  -n   显示匹配行及行号。
  -s   不显示不存在或无匹配文本的错误信息。
  -v   显示不包含匹配文本的所有行。

  grep   '\' 文件

  grep ‘root$’文件

  其区别是$,^结尾和开始匹配的是行的结尾和开头,而\< 和\> 匹配的是单词的开头和结尾
3 扩展GREP
  * 0次或多次
  ? 0次或1次
  +一次或多次
  {n}出现n次
  {m,n} 出现m-n次
  '(xy)'{n} xy 出现n次
  x.*y 以x开头y结尾

  egrep   'x|y'   文件。匹配x或y所在的行

8sed
1 总述
  sed:stream editor文本编辑器在操作文本的时候是按行进行操作的,所以也叫行编译器。
  sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合、交换文件中的资料行,或读入其它档的资料到文>件中,也可替换(substuite)它们其中的字串、或转换(tranfer)其中的字母等等。例如将文件中的连续空白行删成一行、&quot;local&quot;字串替换成&quot;remote&quot;、&quot;t&quot;字母转换成&quot;T&quot;、将第10行资料与第11资料合等.
  总合上述所言,当sed由标准输入读入一行资料并放入pattern space时,sed依照sed script 的编辑指令逐一对pattern space内的资料执行编辑,之後,再由pattern space内的结果送到标准输出,接着再将下一行资料读入.如此重执行上述动作,直至读>完所有资料行为止.
  小结,记住:
  (1)sed总是以行对输入进行处理
  (2)sed处理的不是原文件而是原文件的拷贝
2   sed 常用用法
  a\     在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

  c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用&quot;\&quot;续行


  i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用&quot;\&quot;续行
  d 删除行


  h 把模式空间里的内容复制到暂存缓冲区
  H 把模式空间里的内容追加到暂存缓冲区
  g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
  G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
  l 列出非打印字符
  p 打印行


  n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
  q 结束或退出sed
  r 从文件中读取输入行
  ! 对所选行以外的所有行应用命令
  s 用一个字符串替换另一个
  g 在行内进行全局替换
  w 将所选的行写入文件
  x 交换暂存缓冲区与模式空间的内容
  y 将字符替换为另一字符(不能对正则表达式使用y命令)\
  选项  功能
  -e  进行多项编辑,即对输入行应用多条sed命令时使用
  -n  取消默认的输出
  -f  指定sed脚本的文件名
3 Sed 高级用法
  1 sed -e 's/bin/aaa/g' -e 's/bbb/ccc/g' 文件名
  2 sed's/bin/aaa/g;s/bbb/ccc/g' 文件名
  3 vim rule
  s/aaa/bbb/g
  s/bbb/ccc/g
  Sed -f rule 文件
  4 sed's/#/ /g' 文件将#替换成空格

  5 sed 's/ \/ //g' 文件将/替换成空格
  6 sed's@/@@g'    将/替换成空格

  7 sed '2s/:/##/g' 将第二行的所有: 替换成##

  8 sed '2,3s/:/##/g' 文件将第二行和第三行的:替换成#

  9sed '/root/,/ftp/s/:/##/g' passwd

  10 sed '1s/:/##/g' 文件匹配改变所有

  11 sed '1s/:/##/'文件 匹配改变第一次出现的

  12 sed -n '$p' 文件显示最后一行

  13 sed ‘G’文件,增大行间距

  14 sed '$!G'文件,不对最后一列增加空白行

9 awk
1 总述:
  Awk 是一种编程语言,用于在linux/unix下对文本和数据进行扫描和处理,数据可以来自标准输入/文件/管道
  目前在Linux中常用的awk编译器的版本有mawk,gawk ,其中以redhat为代表的使用的是gawk。以Ubuntu为代表的使用的是mawk
  Gawk使GNU project的AWK解释器的开源代码的实现
  原理:
  awk 逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行相应的操作
  AWK基本结构包括模式匹配和处理过程
  Pattern{action}
  提示:
  AWK读取文件内容的每一行时,将对比该行是否与给定的模式向匹配,如果匹配则执行处理过程,否则对该行不做任何处理
  如果没有指定处理脚本,则把匹配的行显示到标准输出,及默认处理动作是print打印行,
  如果没有指定模式匹配,则默认匹配所有数据
  AWK有两个特殊的模式:BEGIN和END,他们被放置在没有读取任何数据之前以及在所有数据读取完成之后执行
2 AWK 基本语法格式
  1 格式
  Gawk [ x ] -fprogram-file[ - ] file …
  注释: X 表示AWK支持POSTIX以及GNU两种选项,-f后面接脚本文件,file 表示准备处理的文档名称
  2 gwak 支持一下选项
  -Ffs
  --field-separator fs
  指定以fs作为输入行的分隔符(默认分隔符为空格或制表符)
  -v var=val
  在处理过程以前,设置一个变量var为val
  -fprogram-file
  从脚本文件中读取AWK指令,以取代在命令参数中输出处理脚本
  -W compst
  -W traditional
  --compat
  --traditional
  使用兼容模式运行AWK,GNU扩展选项将被忽略
  -W copyleft
  输出简短的GNU版权信息
3 AWK 程序结构
  模式{动作指令}
  模式可以是:
  EBGIN
  END
  表达式
  表达式,表达式
  动作需要以{} 引起起来
4 内置变量
  以下为AWK内置变量
  ARGC命令行参数个数
  FILENAME当前输入文档的名称
  FNR当前输入文档的当前记录编号,尤其当有多个输入
  文档时有用
  NR输入流的当前记录编号    如果有多个文件,则直接向上进行排序
  NF 当前记录的字段个数    记录每一行的字符串数
  FS字段分割符
  OSF输出字段分割符,默认是空格
  ORS 输出记录分割符,默认为换行符
  RS 输入记录分割符,默认为换行符
  1 记录字段:NF默认的分隔符是空格,此处的代表每行以空格为分隔符的列数

  2 记录字段;NR 用于统计文本文件的行数

  此为END 用法

  3 FILENAME:用于显示当前文件名称,若不在END中,则有多少行,显示多少个文件名


5 字段分隔符:
  -F

  指定分割符:FS
  注意:如果使用FS 改变分隔符的话,需要在begin 处定义FS,因为在读取第一行前就需要改变字段分割符
  指定多个字段分隔符

  之前是或的关系,全部处理
  指定分割符并代替默认分隔符
  -OFS 和BEGIN 用法

6 表达式与操作符
  表达式由变量、常量、函数、正则表达式、操作符组成,AWK中变量由字符串变量和数字变量,如果在AWK中定义的变量没有初始化,则初始值为空字符串或0
  加+
  减   -
  乘*
  除/
  取余%
  幂运算^
  自加 ++
  自减--
  相加后赋值+=
  相减后赋值-=
  相乘后赋值*=
  相除后赋值 /=
  大于>
  小于<
  大于等于>=
  小于等于
页: [1]
查看完整版本: shell编程基础之基本文本工具集合