waid 发表于 2018-8-22 07:25:20

Linux shell编程学习实例与参数分析(三)

  第五章 文本过滤
  1.正则表达式
  一种用来描述文本模式的特殊语法,由普通字符以及特殊字符(元字符)组成
  ^    ----只匹配行首
  $    ----只匹配行尾
  *    ----匹配0个或多个此单字符
  []   ----只匹配[]内字符,可以使用-表示序列范围
  \    ----屏蔽一个元字符的特殊含义
  .    ----匹配任意单字符
  pattern\{n\} 只用来匹配前面pattern出现的次数,n为次数
  pattern\{n,\}只用来匹配前面pattern出现的次数,至少为n
  pattern\{n,m\}只用来匹配前面pattern出现的次数,次数在n-m之间
  eg:
  A\{3\}B   AAAB
  A\{3,\}B AAAB AAAAB ...
  A\{3,5\}B AAAB AAAAB AAAAAB
  2.find命令   ----查找文件和目录
  find pathname -options [-print -exec -ok]
  pathname --查找的目录路径. .--表示当前目录,/表示根目录
  -print 输出
  -exec 对匹配的文件执行该参数所给出的shell命令,相应命令形式为'command'{} \;'    注意{}和\;之间的空格
  -ok    与-exec相同,不过执行命令前会有提示
  options   :
  -name
  -perm
  -user
  -group
  -mtime -n +n (atime,-ctime) 修改时间(访问时间,创建时间)
  -size n
  -type 查找某一类型的文件
  eg.
  $ find ./ -mtime +5
  ./helloworld.sh
  ./nohup.out
  查看./目录(当前)下修改时间超过5天的文件
  3.grep介绍
  grep -c 输出匹配行计数
  grep -i 不区分大小写
  grep -h 查询多文件时不显示文件名
  grep -H 显示文件名
  grep -l 查询多文件时只输出包含匹配字符的文件名
  grep -n 显示匹配行及行号
  grep -s 不显示不存在或不匹配文本的错误信息
  grep -v 显示不包含匹配文本的所有行(过滤文本)
  eg.
  $ grep -n 's.a' myfile
  2:/dev/sda1            20G 3.3G   16G 18% /
  4:/dev/sda2            79G   18G   58G 23% /u01
  5:/dev/sda4            28G 3.9G   22G 15% /u02
  $ grep -n '2$' myfile
  5:/dev/sda4            28G 3.9G   22G 15% /u02
  grep -options '正则表达式' filename
  4.sed介绍
  sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件将输出到屏幕
  sed是一种重要的文本过滤工具,使用一行命令或使用管道与grep与awk相结合。
  sed调用:
  1.命令 sed '正则表达式sedcommand' input-files
  2.script :sed -f sedscript input-files
  sed在文本中查询文本的方式
  -行号,可以是简单数字,或一个行号范围
  -使用正则表达式
  x ----行号
  x,y ----行号范围从x到y
  x,y! ---不包含行号x到y
  sed命令选项:
  -n 不打印
  -c 下一个命令是编辑命令
  -f 如果正在调用sed脚本文件
  基本sed命令
  p 打印匹配行
  = 显示文本行号
  a\ 在定位行号后附加新文本信息
  i\在定位行号前插入新文本信息
  d 删除定位行
  c\用新文本替换定位文本
  s 使用替换模式替换相应模式
  r 从另一个文件中读文本
  w 写文本到一个文件
  q 第一个模式匹配完成后退去
  l 显示与八进制ascii代码等价的控制字符
  {}在定位行执行命令组
  n 从一个文件中读文本下一行,并附加在下一行
  g 将模式2粘贴到/pattern n/
  y 传送字符
  eg.
  $ sed -n '2p' myfile
  c
  打印myfile第2行
  $ sed -n '2,4p' myfile
  c
  f
  b
  打印第二行到第四行
  $ sed -n '/a/p' myfile
  a
  打印匹配a的行
  $ sed -n '2,/2/p' myfile
  c
  f
  b
  1
  2
  打印第二行到匹配'2'的行
  s命令替换
  $ sed 's/b/a/p' myfile
  a
  a
  a
  c
  d
  e
  替换b为a
  多点编辑 -e
  eg. (myfile包含a-e)
  $ sed -e '2d' -e 's/c/d/' myfile 11
  a
  d
  d
  e
  sed命令r ---从文件中读取选定的行,读入输入文件中,显示在匹配的行后面
  eg.
  $ cat 11
  *******************Alaska***************
  $ sed '/a/r 11' myfile
  a
  *******************Alaska***************
  b
  c
  d
  e
  写入命令:w   将输入文件中的匹配行写入到指定文件中
  eg.
  $ cat 11
  b
  $ sed -n '/a/w 11' myfile
  $ cat 11
  a
  追加:a   将文本追加到匹配行的后面。sed要求在a后加\,不止一行的以\连接
  eg.
  $ sed '/b/a\****************hello*************\-------------china---------' myfile
  a
  b
  ****************hello*************-------------china---------
  c
  d
  e
  插入命令:i   将文本插入到匹配行的前面。sed要求在a后加\,不止一行的以\连接
  eg.
  $ sed '/b/i\
  > THE CHARACTER B IS BEST\
  > *******************************' myfile
  a
  THE CHARACTER B IS BEST
  *******************************
  b
  c
  d
  e
  下一个:n 从一个文件中读文本下一行,并附加在下一行
  退出命令 q 打印多少行后退出
  eg.
  $ sed '3q' myfile
  a alert
  b best
  c cook
  sed script:
  sed -f scriptfile myfile
  5.awk介绍
  awk可从文件或字符串值基于指定规则浏览和抽取信息
  awk三种调用方式:
  1.命令行方式
  awk [-F field-sperator]'pattern{active}' input-files
  awk [-F field-sperator]'command' input-files
  awk脚本
  所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解析器作为脚本的首行,以便通过键入脚本名称来调用。
  awk命令插入一个单独文件
  awk -f awk-script-file input-files
  awk脚本由模式和动作组成
  分隔符、域、记录
  注意这里的$1,$2是域与位置变量$1,$2不一样。$0文件中的所有记录
  eg:
  awk '{print $0}' myfile
  awk 'BEGIN {print "IP DATE ----"}{print $1"\t"$4}END{print "end-of -report"}
  $ df |awk '$1!~"dev"'|grep -v Filesystem
  none                   1992400         0   1992400   0% /dev/shm
  $ df |awk '{if ($1=="/dev/sda1") print $0}'
  /dev/sda1             20641788   3367972 16225176 18% /
  $ cat employee
  Tom Jones       4424    5/12/66 543354
  Mary Adams      5346    11/4/63 28765
  Sally Chang   1654    7/22/54 650000
  Billy Black   1683    9/23/44 336500
  $ awk '/dams/' employee
  Mary Adams      5346    11/4/63 28765
  $ sed -n '/dams/p' employee
  Mary Adams      5346    11/4/63 28765
  $ grep 'dams' employee
  Mary Adams      5346    11/4/63 28765
  三种命令方式下,使用模式匹配查询
  $ awk '{print $1}' employee
  Tom
  Mary
  Sally
  Billy
  打印文件第一列
  $ awk '/Sally/{print $1"\t"$2}' employee
  Sally   Chang
  打印匹配Sally的行的第一列和第二列
  $ df |awk '$4>20884623'
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/sda2             82567220 17488436 60884616 23% /u01
  /dev/sda4             28494620   4589172 22457992 17% /u02
  打印df输出第四列大于××的行
  格式输出:
  打印函数—
  $ date
  Mon Mar 10 15:15:47 CST 2008
  $ date |awk '{print "Month:" $2"\nYear:" $6}'
  Month:Mar
  Year:2008
  $ awk '/Sally/{print "\t\tHave a nice day,"$1"\t"$2}' employee
  Have a nice day,Sally   Chang
  printf函数
  $ echo "LINUX"|awk '{printf "|%-10s|\n",$1}'
  |LINUX   |
  $ echo "LINUX"|awk '{printf "|%10s|\n",$1}'
  |   LINUX|
  ~匹配符
  $ awk '$1~/Tom/{print $1,$2}' employee
  Tom Jones
  awk 给表达式赋值
  关系运算符:
  <             小于
  >             大于
  ==         等于
  !=            不等于
  >=         大于等于
    /dev/sda1            20G 3.3G   16G 18% /

页: [1]
查看完整版本: Linux shell编程学习实例与参数分析(三)