linghaiyan 发表于 2018-8-24 10:14:32

shell 文本过滤

  ^一行的开始 ^d以开头的^..1 第三个为1的字符   ^字符要放在匹配的字符前面
  $一行的末尾 ^$ 表示空行 ^.$匹配一行一个字符的$字符要放在匹配的字符后面
  *匹配任意个字符包括0个字符 .表示单个字符
  \可以屏蔽一个特殊的字符 \*\.pas 这里的*是特殊字符,这样就表示*.pas这个文件
  逗号可以分割不同的匹配字符如表示S或者s都可以
  -表示一个范围,,,任意的字符或者数字
  A\{2\}B 表示A出现了2次AAB
  A\{4,\}B 表示A至少出现4次 AAAAB,AAAAAB
  A\{2,4\}B 表示A出现2-4次AAB AAAB AAAAB
  \{3\}\.\{3\}\.\{3\}\.\{3\}0-999.0-999.0-999.0-999
  查找文件的时候 find 用到的
  find pathname -options [-print -exec -ok]
  -name -perm 权限 -user -group -mtime -n +n-atime -ctime 文件的时间 -size-nogroup 无有效属组的文件/etc/group 下不存在 -nouser 无有效用户的文件/etc/passwd
  -newer file1 !file 比文件一新但比文件2旧的文件 -type 文件类型
  find . -name "*.rep" -print 匹配了含有.rep的文件,-print 可以不用写
  find . -name "*" -print 当前目录下以大写字母开头的
  find . -perm 775 当前目录下以775权限的文件
  -print 将查找到的文件输出到标准输出
  -execcommand {} \
  找到后执行一些shell命令
  find . -type f -exec ls -l {} \ 查找到并且ls
  find . -name "*.log" -mtime +5 -ok rm {} \ 查找5天以前的到并且rmok命令要求得到确认
  xargs 和exec的区别 exec会发起多个进程,而xargs 只有一个进程减少系统资源的消耗
  find . -prem -7 -print|xargs chmod o-w
  find . -prem -7 -print|xargs file 查看文件类型
  grep 标准的,扩展的
  grep [选项]基础正则表达式[文件]正则表达式最好用“”括起来
  -c 只输出有多少行匹配到了
  -i 不区分匹配的大小写
  -h 查询多文件时不显示文件名
  -H 显示文件名
  -l 查询多个文件时,只显示包含匹配字符的文件名
  -n 显示匹配行和行信息
  -s 不显示不存在的或无匹配的错误信息
  -V 过滤掉表达式的部分
  grep "^[^210]"1.txt 非210开头的,2,1,0开头的行都被过滤掉 3-9开头的都可以显示出来
  [[:upper:]]
  [[:alnum:]]
  [[:lower:]]
  [[:space:]] 空格或tab键
  [[:digit:]]
  [[:alpha:]]
  grep "5[[:digit:]][[:digit:]]" 1.txt500-599的匹配
  awk
  命名的方式:
  awk [-F filed-spearator] 'commend' input-files
  awk 脚本 :所有的命名都放在一个文件里面
  awk命令插入一个单独的文件
  awk -f awk-script-file input-file
  默认的分割符为空格 -F : 以:为分割符awk -F : '{print $1"\t"$4}' i.txtprint中是要用“”引起来字符串的
  明白记录,分割,域。一条记录被分割就成了域 awk主要进行的操作就是对域进行操作 动作对数据进行处理 放在{}中内指明。一般用print,模式部分决定动作什么时候被触发
  域:$0 $1...$n
  awk'BEGIN {ptint "IP                  date\n"} {print $1"\t"$4} END{print "end of report"} 1.txt
  IP                  date
  $1    $4
  end of report
  awk 中特殊的字符“+“”?“ 前者表示多个字符,后者表示一个字符 ~ 匹配 !~不匹配
  cat i.txt|awk '$0 ~ /218.79.131.96/'
  awk '$0 !~ /210.12.12.30/' i.txt
  awk '{if($1=="210.12.12.30") print $0}' i.txt
  sed 不对原有的文件操作,先拷贝一个副本,所有操作在副本上操作
  sed
  命令格式
  sed 脚本 :sed 选项 输入文件
  sed 脚本 输入文件 :sed 选项 -f sed脚本文件 输入文件
  如果没有输入文件,它会从标准输入得到 :sed脚本文件 选项 输入文件
  选项
  -n 不打印没匹配到
  -c 下一个命令是编辑命令
  -f 如果正在调用sed脚本
  sed '2p' i.txt      p就是打印
  sed -n '2p' i.txt   第2行不打印没匹配到的,只打印匹配到的
  sed -n '1,2p' i.txt   打印2行
  sed -n '/los/p' i.txt 匹配到los
  sed -n '2,/los/p' i.txt 从第3行开始到匹配的los结束
  sed -n '/^$/=' i.txt 打印出空行的行号
  sed -n -e '/^$/p' -e '/^$/=' i.txt不能同时用-e 区分
  sed '/aaaio/a\shenz' i.txt 会在找到aaaio后追加一行写上shenz 要分两行进行书写
  sed '/aaaio/i\shenz' i.txt 会在找到aaaio前追加一行写上shenz
  sed '/aaaio/c\shenzddd' i.txt 会在找到aaaio 替换成shenz   ddd
  sed '1,2d' i.txt 会把1,2行给删除掉
  sed 's/shenz/shenzhen/g' i.txt所有shenz的地方全部替换 不加g时只在当次替换
  sed 's/shenz/& shenzhen /p' i.txt 匹配到了shenz以后加上shenzhen
  sed 's/shenz/ shenzhen &/p' i.txt 匹配到了shenz之前加上shenzhen

页: [1]
查看完整版本: shell 文本过滤