首页 > 技术文章 > Linux学习笔记四 grep, sed, awk

wlc297984368 2017-10-10 18:07 原文

正则表达式
  grep
  grep '^[a-z]' passwd "^string" ^是搜索以该字符串开头行
  grep '.$' passwd .是任意一个字符
  grep '\.$' passwd $是搜索以.结尾的行 \对句号进行转义
  grep '!$' passwd $是搜索以该字符串结尾的行
  grep 'g..d' passwd 拥有g开头d结尾的词的行
  grep 'goo*d' passwd *重复前边字符0次或者多次 good gooood 都可以匹配出来 若是goo* 则可以匹配到go goo gooo
  grep '[^a-z]$' passwd 不是以小写字母结尾的行
  grep 'go\{2\}g' passwd \{n\} 查找斜杠前重复n次的单词 google
  grep 'go\{2,5\}g' passwd \{n,m\} 查找斜杠前重复n-m次次的单词 google goooogle
  grep 'go\{2,\}g' passwd \{n,\} 查找斜杠前重复n次及n次以上的单词 google goooogle
  ctrl + l 清屏

  echo $? 输出一个整数 如果为0意思是上一个命令执行成功 若果非零则没有执行成功
  echo $$ 显示当前shell的进程号
  sed
  sed -n '/t[ae]st/p' passwd 查找test 和 tast 的行
  sed -n '/test/p' passwd 查找test的行
  sed -n '/test/q' passwd 查找到test的第一行就退出只匹配一次
  sed -n '/test/g' passwd 查找到test的行用空行代替
  sed -n '/test/G' passwd 查找到test的行的下面添加一个空行
  sed -n '/^[a-z]/p' passwd 搜索以小写字母开头行
  sed -n '/!$/p' passwd 搜索以!结尾行
  sed -n '/g..d/p' passwd 搜索含有g**d的行
  cat -a passwd | sed '2a 第二行后面插入'
  cat -a passwd | sed '2i 第二行前面插入'
  cat -a passwd | sed '/good/ a Hello append' 在匹配到的good下面行添加该内容
  cat -a passwd | sed '/good/ i Hello insert' 在匹配到的good上面行添加该内容
  cat -a passwd | sed '2,3c 该插入行将2,3行替换'
  cat -a passwd | sed '2,4d' 将2,3,4行删除
  cat -a passwd | sed -n'2,4p' 选择显示2-4行
  cat -a passwd | sed 's/is/IS/g' 将is 替换成IS g全局替换 s进行替换操作
  管道符之前是为了显示行号
  sed 操作不会使得原文件改变如果想保存就是用文档流重定向保存到新文件即可

创建sed脚本
  vi test.sed
  #! bin/sed -f
  XXXXXXXXXXXXXXX
执行sed脚本
  添加执行权限 chmod u+x test.sed
  ./test.sed filename : ./指的是当前目录下的sed脚本

awk
  awk 'BEGIN{print "========"} {print \$0} END{print "======"; print FS,NR,NF,\$NF}' passwd
  NR 记录的行数
  NF 域的个数
  动作模式都位于单引号之内
  命令内部所有双引号成对出现
  大括号括起动作语句 圆括号括起条件语句
  awk内置参数 域标记为$1$2$3$4 $0为行信息 $NF 第NF个域 FILENAME 文件名
  默认空格是区分域123的字符 但是可以指定BEGIN{FS=":"}现在就是指定以:为分隔符进行区分域
  元字符 \ ^ $ . [] | * + ?
  条件操作符 < > <= == !=
  规则就是把grep sed 要匹配的规则放入awk 中的/规则/中就可以执行形同的操作
  awk '{if(\$0~/good/) print \$0}' passwd ~匹配正则 !~不匹配正则 (匹配到含有good的行就输出)美元符号前\用于转义
  awk '{if{\$0~/[ABC]/) print \$0}' passwd 匹配含有大写字母A B C 的行
  awk '{if{\$0~/^[^A-Za-z]/) print \$0}' passwd 匹配开头字符不是以大小写字母开头的行
  awk '{if(\$5==1024) print \$0}' passwd | cat -n 第五个域等于1024的显示出来并且显示行号
  awk '{if(\$5==1024 && \$6~/good/) print \$0}' passwd | cat -n 第五个域等于1024并且第6个域含有good的显示出来并且显示行号
  awk 'BEGIN{a = 0; a += 1;print a}'

推荐阅读