Linux之sed与awk

sed 是一个流处理编辑器,它能帮助我们自动处理文件,分析日志文件、修改配置文件等

Stream Editor文本流编辑,sed是一个“非交互式的"面向字符流的编辑器。能同时处理多个文件多行的内容

  1. 可以不对原文件改动, 把整个文件输出到屏幕
  2. 可以把匹配到的内容输出到屏幕 上
  3. 还可以对原文件改动, 但是不会再屏幕上返回结果
  • sed [-hnV][-e<script>)][-f<script文件>][文本文件]
  1. -e<script>或--expression= <script>以选项中指定的script来处理输入的文本文件。
  2. -f<script文件 >或--file= <script文件>以选项中指定的script文件来处理输入的文本文件。
  3. -h或--help 显示帮助。
  4. -n或--quiet或-- silent仅显示script处理后的结果。
  5. -V或--version显示版本信息。
  • sed动作可以理解为操作
  1. a:新增,a的后面可以接字串,新增字符串会在目前的下一行
  2. C :取代,C的后面可以接字串,这些字串可以取代n1,n2之间的行
  3. d:删除,因为是删除,所以d通常写在最后
  4. i :插入,i的后面可以接字串,新增字串会在目前的上-行
  5. p:打印,将某个选择的数据显示出。通常p会与参数sed -n一起运行
  6. s:替换,可以直接进行替换。通常这个s的动作可以搭配正则表示。例如1,20s/old/new/g (是不是和vim的替换很像? )

查找行

  • 在文件中查找包含22222的行

  • cat sed.test | sed -n "22222/p

  • 在文件中添加第三行,内容为hello
  • sed -e '2a hello world' sed.test
  • 删除行,删除2到3行
  • cat -n sed.test | sed -e '2,3d'
  • 删除包含22222的行
  • cat sed.test | sed '/22222/d'

替换行

  • 将1-2行替换为ha haha
  • cat -n sed.test | sed '1,2c hahaha'
  • 查找并替换字符串
  • 将示例文本的中Hello换成Haha
  • sed 's\Hello\Haha\g' sed.test
  • awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。它支持用户自定义函数和动态正则表达式等功能,是linux/unix 下的-一个强大编程工具,awk命名来自于三位创始人Alfred Aho, Peter Weinberger,和BrianKernighan的Family Name的首字符。
  • awk的处理方式:awk- -次处理一行内容awk对每行可以切片处理,空格和制表符为默认分隔符将每行切片切开的部分再进行各种分析处理

Awk格式

  • 命令行格式:

  • awk [选项参数] 'script' var=value file(s)

  • script组成: pattern {awk操作命令}

  • pattern:正则表达式;逻辑判断式

  • awk操作命令:内置函数: print() printf() getline..;

  • 控制指令: if;;{...}esle{...};whilo(){...};

  • Awk内嵌参数应用
  • 内置变量1:
  • $0:表示整个当前行
  • $1:每行第一个字段
  • 内置变量2:
  • NR:每行的记录号,行号
  • NF:字段数量变量,字段总数
  • FILENAME:正在处理的文件名

awk示例

  • 以:分割,显示/etc/passwd的第一列, 即用户名列

  • cat /etc/passwd | awk -F : '{print $1}'

  • 显示/etc/ passwd的第1列和第7列,用逗号分隔显示,所有行开始前添加列名start1, start7, 最后一-行添加,end1, end7
  • cat /etc/passwd | awk -F ':' 'BEGIN {print "start1,start7"} {print $1 "," $7} END {print "end1,end7"}'
  • 匹配某段字符
  • cat /etc/passwd | awk -F : '$1 ~ /oo/'
  • 显示/etc/passwd的前五行,显示每行的行号、列数,以及该行完整的内容
  • head -n5 /etc/passwd | awk -F : '{ print NR " " NF ” " $0 }'
  • 条件操作匹配
  • cat /etc/passwd | awk -F : '$3=="0"'
  • 这里操作符号可以用==、> ,>=、<、<=、!=都是可行.和数字比较时,将数字要用双引号“"引起来,表示字符串,不加引号则表示数字
  • cat /etc/passwd | awk -F : '$3>="1000" '
  • 累加前四行用户的uid
  • head -n4 /etc/passwd | awk -F : '{(sum= sum+ $3)};END{print sum}'
  • 流程控制类
  • 输出第一个字段的第一个字符大于q的行
  • cat /etc/passwd | awk -F ':' '{ if ($1 > "q") {print $1 } else { print "-"} }'
  • 可以将上面控制语句放在一个脚本      
  • 中,调用脚本
  • 脚本如右图
  • 执行结果如下图                                       

猜你喜欢

转载自blog.csdn.net/m0_60941423/article/details/121547773