Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义。针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助。此篇文档作用就是在自己忘记个别参数的情况下有个一目了然的答案。

一、sed进行文本处理

Linux的sed工具是linux的流编辑器,用于处理文本文件,配合正则表达式使用,功能非常强大。以下是一些sed使用示例和解释:

# sed 's/oracle/CHAVIN/' textfile

替换文本文件textfile中oracle为CHAVIN。脚本中的s表示替换字符的意思。

# sed -i 's/oracle/CHAVIN/' textfile

-i参数意味着替换结果直接覆盖了源文件。

# sed 's/mysql/MYSQL/g' textfile

# sed 's/mysql/MYSQL/2g' textfile

# sed 's/mysql/MYSQL/3g' textfile

默认情况sed会将每一行中第一处符合条件的字符替换掉,g代表替换当前行中匹配的所有的字符。如果想替换第n处,可以指定ng。

# sed 's:root:CHAVIN:' passwd

# sed 's|root|CHAVIN|' passwd

其中:、|和/一样都被用作界定符,效果相同。

# sed '/^$/d' textfile

# sed '/mysql/d' textfile

符号^$/d可以移除textfile中的空白行。

/mysql/d可以移除匹配包含字符mysql的行。

# sed 's/\b[0-9]\{3\}\b/NUMBERS/g' textrep

匹配正则 \b[0-9]\{3\}\b 的选项被替换。

# echo this is an example | sed 's/\w\+/[&]/g'

其中&号代表匹配的字符串内容。正则\w\+匹配单词。

# echo this is eigit 7 in a number | sed 's/eigit \([0-9]\)/\1/'

替换\([0-9]\)匹配的字符串,第一个匹配的使用\1表示,第二个使用\2表示,依次类推。

# echo hello world | sed "s/$name/HELLO/"

Sed可以使用双引号引用,使用双引号可以使用变量($name)的形式,单引号引用的不可以。

二、awk进行高级文本处理

使用awk的优势在于,它可以同时对行和列进行处理。awk脚本结构如下:

awk ‘BEGIN{ print “start” } patten { commonds } END{ print “end” }’ file

如上,awk脚本由3部分组成,BEGIN、END、带匹配选项的语句块可以随意省略。

Awk自带的一些重要功能:

l NR:记录数量,当前行号

l NF:当前行字段总数

l $0:当前行内容

l $1:当前行第一个字段内容

l $n:当前行第n个字段内容

l $NF:当前行最后一个字段内容

以下为常用用法示例及解释:

# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line no:"NR",No of fields:"NF",$0="$0",$1="$1",$2="$2",$3="$3,"$NF="$NF}'

测试NR、NF、$0、$1、$n、$NF

# awk '{ print $3,$2 }' textfile

打印第2行、第3行数据

# seq 5 | awk '{sum=sum+$1}END{print sum}'

计算累加

# seq 5 | awk 'BEGIN{print "===================="} !/3/ { print $0 } END{print "===================="}'

打印不包含3的行内容。

!/3/属于awk中字段过滤部分,常用的过滤方式如下:

NR<5:行号小于5的行

NR==1,NR==5:行号在1~5之间

/linux/:包含linux的行

!/linux/:比包含linux的行

# var=1000

# echo | awk -v VARIABLE=$var '{ print VARIABLE }'

使用参数“-v”将外部变量传递给awk

# var1=1000

# var2=2000

# echo | awk '{print v1,v2}' v1=$var1 v2=$var2

将变量赋值放在awk语句块后边声明,可以同时传递多个值到awk中

# awk -F: '{ print $1,$2,$3,$4,$NF }' passwd

使用参数“-F”设定字段分隔符,默认字段分隔符是空格,这里指定为“:”。

# echo | awk '{ for(i=1;i<10;i++){ print i } }'

在awk中使用for循环。

# echo | awk -F: '{ "grep root /etc/passwd" | getline output;print output }'

使用输出结果读入变量方式为output赋值,语法为【“command” | getline output】。

Awk内嵌函数参考文档:http://www.cnblogs.com/chengmo/archive/2010/10/08/1845913.html

shell脚本之使用sed和awk进行文本处理的更多相关文章

  1. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  2. Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...

  3. Shell脚本学习之sed详解

    在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理. 一.什么是sed? sed 是一种在线编辑器,它一次处理一行内容.sed是非交互式的编辑器.它不会修改文件,除 ...

  4. shell基础 -- grep、sed、awk命令简介

    在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...

  5. Shell脚本的编写,sed的使用以及一些正则表达式

    Shell脚本的简单编写以及sed的使用 标签(空格分隔): 博客文章 前一阵子为了批量修改Web审计规则,故编写了一个Shell脚本,顺便使用了下sed,顺便把正则表达式也重新学习一遍,感觉还是需要 ...

  6. shell脚本三剑客之sed

    shell脚本之sed命令 1.概述 2.工作流程 3.命令格式 4.具体操作 1.概述: 1.sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 2.sed编辑器 ...

  7. 一个利用sed和awk处理文本的小栗子

    这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...

  8. LINUX系统下的shell命令---grep、sed、awk

    1)grep文本过滤命令 1.grep基本认识 (Global  search  regular expression and  print  out the  line全局搜索研究正则表达时并显示出 ...

  9. shell脚本学习(6)awk 编排字段

    awk能取出文本字段重新编排 1 awk的用法 awk ‘program’ [file] 2 其中program 可以写成 ‘parrtern {action}’    pattern 或 actio ...

随机推荐

  1. 项目通过tomcat部署到服务器,请求数据中文乱码问题

    问题: 本地项目请求访问,浏览器中文输出没问题.部署到服务器上面之后,返回到浏览器的中文就乱码了. 尝试办法: 1.修改tomcat下的conf中的service.xml中的配置信息: 重新启动后,没 ...

  2. [android开发教程] 一个神奇的Demo 帮你掌握所有android控件

    (本文内容来源:http://www.eoeandroid.com/thread-182392-1-1.html  转载请注明出处!) 2.jpg (23.78 KB, 下载次数: 0) 下载附件   ...

  3. 关于JS拒绝访问错误

    错误如图所示,只要点击红色区域 内的任何一部分都会弹出 “js拒绝访问”,以为是浏览器的原因,卸载安装都不好使,左面的是树.点击树的节点弹出右面相应的页面. Node.NavigateUrl = “h ...

  4. Mongodb嵌套文档的改动-利用数组改动器更新数据

    初学mongodb的可能和我一样有个疑问.mongodb是文档型的,那么假设一个文档嵌套另外一个文档,假设对这个嵌套文档进行增删改查呢. 就像例如以下这样:.怎样对auther里面的name进行增删改 ...

  5. 在 Redis 上实现的分布式锁

    由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多技术上的难点,在这我将对每一个有用 ...

  6. 运行第一个Docker容器-Docker for Web Developers(1)

    1. Docker介绍 Docker由dotCloud公司发起的一个内部项目,后来Docker火了,dotCloud公司改名为Docker了: Docker使用了Go语言开发,基于 Linux 内核的 ...

  7. Spring Boot 应用 发布到Docker

    Spring Boot 应用 先把命令行切换到Maven项目的根目录 E:\gitCode\galaxyguardians 通过mvn clean package命令打包应用程序 ,在E:\gitCo ...

  8. CentOS 配置集群机器之间SSH免密码登录

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远 ...

  9. Java知多少(89)列表和组合框

    有两种类型的菜单:下拉式菜单和弹出式菜单.本章只讨论下拉式菜单编程方法.菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的.菜单与JComboBox的相同之处是每次只可选择一个 ...

  10. Hadoop、Spark 集群环境搭建

    1.基础环境搭建 1.1运行环境说明 1.1.1硬软件环境 主机操作系统:Windows 64位,四核8线程,主频3.2G,8G内存 虚拟软件:VMware Workstation Pro 虚拟机操作 ...