导读

本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行)


目录
  1. 基本文本处理
  2. 流编辑器sed
  3. awk模式扫描与处理语言
1、基本文本处理

sort :用于排序,常用参数 -t 指定一行的分隔符 -k 指定具体排序的规则 -d 按字典序排列  -f 忽略大小写

    -u (unique)丢弃相同指定字段的记录

unique:报告或删除文件中重复的行。 -c 在输出行前加上出现的次数    -d  (duplicated)显示重复的行

                  -u 仅显示不重复的行

wc:  统计文本行数,字数和字符数。    -c 字符数    -w  单词数    -l  行数

pr:将文本转换成适合打印的格式。   -c 显示的列数(截断超出的部分)

fmt: 优化文本的格式。  -w 设置一行显示的最大行宽   -s  只对过长的行进行换行,不要自动回填。

fold:限制文本宽度(强行截断并换行)。 -w 指定宽度  -s 只在空格处换行。

cut :截取行的字段。   -delimiter  设置字段分割符 -f List 设置截取的域

           List可以是M,M-,M-N -M;可以用逗号指定多个

join:连接两个文件的数据字段。  join file1 file2  -1 M  -2 N    M、N指定匹配的字段

tr: 文本替换。 tr set set :将str1上字符替换成str2上对于位置的字符; (可以是 tr 'a-z' 'A-Z')

        tr {-d|-s} set :-d 删除set上的每一个字符 ;-s 除去连续出现的set中的字符,至只剩下单个

        tr -c (complement 互补)使用set1的外的其他字符 [例子:tr -cs '[:lower:][:upper:]' '[\n*]' 单词表]

2、流编辑器sed

0)sed 的作用和工作方式

sed 是一个非交互式的的行编辑器,工作时,从指定的输入读入一行数据存入被称为模式空间(Pattern Space) 的临时缓冲区,然后按照指定的sed编辑命令处理缓冲区里面的内容,将结果输出到标准输出后从模式空间中删除,然后继续读取下一行继续工作。

1) 地址范围

sed -e '1,5d'  test.txt
sed -e '/^#/d' test.txt

规则表达式中使用的表达式字符:

字符 描述
^ 与行首匹配

$

与行尾匹配

.

与任意一个字符匹配
* 与之前一个字符的零个或多个出现匹配
[] 与[]之间的所有字符匹配

 2) 参数

-e     将脚本添加到命令执行,如上面的 '/^#/d'

-n    禁止模式空间的自动打印

替换文本:   sed -e "s/benson/BENSON/g"  将benson 替换成大写

      sed -e "1,10s/benson/BENSON/g" 将1-10行的benson变成大写

          s/// 的 “/”可以被替换:比如 sed -e "s:/usr/local:/usr:g"

多条命令一起执行:  sed -n -e "=;p"   打印行号;打印行 (等价与 sed -e "=" -e "p" )

多条命令于同一地址范围:sed -n -e '1,5{s/benson/BENSON/g;s/laur/LAUR/g}'

把命令放在文件fsed里:sed -n -f fsed

3、awk模式扫描与处理语言

awk 具有成为一门语言应有的要素:变量,函数等,是强大的处理工具。

例子:

awk -F ":" '{print "USER:" $1  "\tSHELL: " $7 }'  /etc/passwd
结果:
USER:root SHELL: /bin/bash
USER:daemon SHELL: /usr/sbin/nologin
USER:sync SHELL: /bin/sync

上面的命令也可以写入文件file.awk中:

awk -f file.awk /etc/passwd
BEGIN{ FS=":" }
{
print "USER:" $ "\tSHELL: " $
}

file.awk

3.1 awk的变量和数组

1)用户自定义变量

命名规则:[A-Za-z_][A-Za-z0-9_]*

2) 常用的内建变量

变量 说明
FILENAME 当前输入的文件名称
FNR 当前输入的文件的记录数
FS 字段分隔符(支持正则表达式),默认空格
NF 当前记录的字段数
NR 在工作(job)中的记录数
OFS 输出字段分隔字符
ORS 输出记录分隔字符(默认为“\n”)
RS 输入记录分隔字符

3) awk数组  的字符索引支持数字、字符串

sit[google]="https://google.com"
sit[baidu]="http;//baidu.com" 数组存储是稀疏的,可直接定义如下两项:
x[]=
x[]= delete x 将删除数组里所有的元素 删除后,可以继续定义如下:
x=

访问环境变量:ENVIRON["PATH"]

3.2 算数运算
awk的运算符 
运算符 描述 例子
=  +=  *=   /=  ^=  **= 赋值  
?= C条件表达式  
||   && 逻辑与或  
++-- 自增自减  
~   ~! 匹配正则表达式和不匹配正则表达式  
<   <=  >  >=  !=  == 关系运算符  
空格 连接  
+ - 加、减  
* /  % 乘除 求余  
+  -  ! 一元加减,逻辑非  
^  *** 求幂  
$ 字段引用  
in 数组成员  

awk支持的算数函数:  

    sin(x) cos(x) atan2(x,2) :x,y 范围内的余切 int(x):没有舍入地取整 exp(x)求幂 log(x):自然对数 sqrt(x)

    rand():产生>=0 <1的随机数 srand(x):x是rand()的种子

3.3 条件和循环语句

条件语句和循环语句与C类似,支持break,continue(可以不使用;结尾)

例子:将下面记录每组一行输出

abc,
tttt dddd ddd,
ssss ssdd
sdfsd sdf dddd
sfdfsdf

待处理数据

BEGIN{
FS="\n"
RS=""    # RS设置为""将可以解析多行记录(以空行分隔)
ORS="" #输出记录分隔符不要换行
}
{
x=
while(x<NF)
{
print $x "\t"
x++
}
print $NF "\n"
}

使用while循环

结果:

abc,    tttt  dddd
ddd, ssss ssdd sdfsd sdf
dddd sfdfsdf

处理结果

3.4 自定义函数

在函数中,指定的参数将被当做局部变量,而所有函数体内未出现在参数列表中的变量会被视为全局性。为此,awk允许声明过多的参数用于局部使用如:

function add(x,y,      sum)
{
sum = x+y
return sum
}

如果需要使用函数进行引用传递,只能通过传入数组来实现:

引用传递
3.5 字符串处理

格式化输出:

printf("%s have %d jobs","somebody",)
strout = sprintf("%s have %d jobs","somebody",)

格式化输出的转义字符:c s d ld (十进制长整数) u lu x lx o lo e(科学计数法表示的浮点数) f g(e或f中比较短的一种)

printf 修饰符:  - 左对齐     #显示八进制时在前面加个0;显示十六进制时在前面加0x

         +显示defg 转换的整数时,加上正负号    0  填充空白为0

        具体的格式为:%-width.precision fotmat-specifier

awk内置字符串函数:

awk函数 描述
sub(/reg/,newsubstr,str) 替换第一个匹配的字符串
gsub(/reg/,newsubstr,str) 替换所有匹配
index(str,substr) 返回substr在str中的索引
length(str) 长度
match(str,/reg/) 如果在str中找到正则表达式/reg/匹配的串,则返回出现的位置,未找到则返回0
split(str,array,sep) 使用sep分隔到array
substr(str,position[,length]) 返回str从position开始的length个字符
tolower(str) 变小写
toupper(str) 变大写
sprintf("fmt",expr) 格式化返回字符串
3.6 多文件处理
 南京 佛挡杀佛 sdfsdf
天津 发生地方 双方的发生
石家庄 发生地方 发生地方

a.txt

,南京
,天津
,河北省
,品上线
,石家庄

b.txt

BEGIN{
FS="[ ,]"
OFS=","
} NR <= FNR{
array[$]=$
}
NR > FNR{
print $,$,array[$]
}

join.awk

awk  -f join.awk a.txt b.txt
,南京,
,天津,
,河北省,
,品上线,
,石家庄,

执行结果

linux —— shell 编程(文本处理)的更多相关文章

  1. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  2. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  3. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  4. 一文学完Linux Shell编程,比书都好懂

    一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...

  5. 前端学习 linux —— shell 编程

    前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...

  6. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  7. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  8. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  9. linux shell 修改文本 sed

    linux shell 修改文本echo [root@DSI tmp]# echo 'yhqt1 test1' > test1.txt [root@DSI tmp]# cat test1.txt ...

随机推荐

  1. Codevs 4768 跳石头 NOIP2015 DAY2 T1

    4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...

  2. 解决打不开jar包

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...

  3. php 解决大流量网站访问量问题

    当一个网站发展为知名网站的时候(如新浪,腾讯,网易,雅虎),网站的访问量通常都会非常大,如果使用虚拟主机的话,网站就会因为访问量过大而引起 服务器性能问题,这是很多人的烦恼,有人使用取消RSS等错误的 ...

  4. Windows phone 之Socket

    服务器端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  5. 桂电在线-转变成bootstrap版2(记录学习bootstrap)

    下载bootstrap框架https://github.com/twbs/bootstrap 或者 http://getbootstrap.com/ 拷贝模板 修改基本模板 语言zh-cn,标题,描述 ...

  6. java 读入换行

    java中实现换行有以下几种方法:1.使用java中的转义符"\r\n": 注意:\r,\n的顺序是不能够对换的,否则不能实现换行的效果. 2.BufferedWriter的new ...

  7. 2016022603 - redis数据类型

    Redis支持5种类型的数据类型 1.字符串:Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限.[类 ...

  8. 关于Memcache使用的工具类

    分布式缓存有它自己的好处 . 下面的 ConstValue.sessionId  是一个常量 public static readonly string sessionId = "sessi ...

  9. 不支持关键字: “userid”。

    运行程序提示:不支持关键字: “userid”. 找了很久在一篇博客里面提示web.config数据库字符串链接出错.

  10. Chrome控制台

    先的简单介绍一下chrome的控制台,打开chrome浏览器,按f12就可以轻松的打开控制台 大家可以看到控制台里面有一首诗还有其它信息,如果想清空控制台,可以点击左上角那个来清空,当然也可以通过在控 ...