博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识shell文本处理工具之gawk-sed
阅读量:5971 次
发布时间:2019-06-19

本文共 3137 字,大约阅读时间需要 10 分钟。

shell

gawk

gawk选项

  • -F 指定行中分隔数据字段的字段分隔符
  • -f 指定处理程序的脚本名
  • -v var=value 定义gawk程序中的变量
  • -mf N 指定处理数据文件中的最大行数
  • -mr N 指定数据文件的最大数据行数

gawk数据字段变量

  • $0 表示整个文本行
  • $1 表示整个文本行中第一个数据字段
  • $2 表示整个文本行中第二个数据字段

一个简单的案例

# BEGIN这是处理数据之前运行的脚本BEGIN {# 这是定义的变量,在以下其他阶段的脚本中也可以调用,变量的调用方式如同shell中调用变量,但是不加$符号separator1="           "FS=":"print "用户名"separator1"密码"separator1"用户ID"separator1"组ID"separator1"用户全名"separator1"主目录"separator1"登录shell"separator1}# 这是进行数据处理的脚本{ print $1 separator1 $2 separator1 $3 separator1 $4 separator1 $5 separator1 $6 separator1 $7 separator1}# END这是数据处理最后要运行的脚本END {print "==========================THE END======================="}

指定方式为:

root@node1:~# gawk -f ./passwd.awk /etc/passwd

sed

替换标记

  • g: 全局替换
  • p: 打印替换后的行
  • 数字 表明新文本将替换地挤出模式匹配的地方
  • w: 将替换的结果写入到文件中

替换字符

为了防止与某些特定的字符相冲突,sed支持选择其他的字符进行分隔

sed 's!/bin/bash!/bin/csh' /etc/passwd

行寻址

  • 行的数字范围
  • 用文本模式来过滤出某行

行寻址的使用格式

[address]command

也可以把特定地址的多个命令放在一起

address{    command1    command2    command3}

数字方式寻址

sed '2s/dog/cat/' data1'sed '2,21s/dog/cat/' data1'sed '2,$s/dog/cat/' data1'

文本模式寻址

sed '/admin/s/dog/cat' data2

组合命令

root@node1:~# sed -n '2{s/daemon/admin/g;s/nologin/login/p}' /etc/passwdadmin:x:1:1:admin:/usr/sbin:/usr/sbin/login

删除行

sed 'd' data2 #删除data2中的所有记录sed '3d' data2 #删除data2中第三行sed '4,$d' data2 #删除data2中第四行到最后的数据sed '/line   1/d' data2 #删除模式匹配到的行sed '/1/,/2/d' data2 #匹配到第一个打开行删除功能,匹配到第二个执行行删除功能,并删除两个匹配到的行,如果第二个模式没有被匹配到,那么整个文件的数据都被删掉了

插入和附加文本

  • insert i 在指定行前插入一个新行
  • append a 在指定行后插入一个新行
root@node1:~# echo "line" | sed 'i\linedemo'linedemolineroot@node1:~# echo "line" | sed 'a\linedemo'linelinedemo

但是在数据流中需要指定要插入或者要追加的位置

root@node1:~# cat date2 line1line2line3root@node1:~# sed '1i\demo' date2 demoline1line2line3root@node1:~# sed '2a\demo' date2 line1line2demoline3# sed '1i\first line' date2 # 总是插入在第一行# sed '$a\end line' date2 # 总是追加在最后一行

修改行

root@node1:~# sed '3c\the change line' date2 line1line2the change lineroot@node1:~# sed '1,$c\the change line' date2 the change lineroot@node1:~# sed '1,2c\the change line' date2 the change lineline3root@node1:~# sed '/line1/c\the change line' date2 the change lineline2line3

转换命令

# 前面的数字与后面的字母一对一的进行转换,1映射到aroot@node1:~# sed 'y/123/abc/' date2 linealineblinecroot@node1:~# sed '1,2y/123/abc/' date2 linealinebline3

回顾打印

  • 小写p 用来打印文本行
  • 等号= 用来打印行号
  • 小写l 用来列出行

打印文本行

root@node1:~# head -3 /etc/passwd | sed 'p'root:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologindaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinroot@node1:~# head -3 /etc/passwd | sed -n 'p'root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin

打印行号

root@node1:~# head -3 /etc/passwd | sed -n '='123root@node1:~# head -3 /etc/passwd | sed '='1root:x:0:0:root:/root:/bin/bash2daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin3bin:x:2:2:bin:/bin:/usr/sbin/nologin

列出行

# 注意每行最后的一个$字符root@node1:~# head -3 /etc/passwd | sed -n 'l'root:x:0:0:root:/root:/bin/bash$daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin$bin:x:2:2:bin:/bin:/usr/sbin/nologin$

转载于:https://blog.51cto.com/bkmaster/2120484

你可能感兴趣的文章
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
redis主从配置<转>
查看>>
karma如何与测试框架合作2之webpack
查看>>
10分钟搭建MySQL Binlog分析+可视化方案
查看>>
vmware虚拟机配置串口
查看>>
小型自动化运维--expect脚本之传递函数
查看>>
Nsrp实现juniper防火墙的高可用性【HA】!
查看>>
oracle11g 安装在rhel5.0笔记
查看>>
解决Lync 2013演示PPT提示证书问题的多种方法
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
C++ 构造函数与析构函数
查看>>
ssh免密码登录
查看>>
Linux下Django环境安装
查看>>
如何在指定的内容中找出指定字符串的个数
查看>>
我的友情链接
查看>>
我的友情链接
查看>>