导读

本文为博文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. HDU_1406 完数

    Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是 ...

  2. [Lua]基于cc.load('mvc') .ViewBase索引资源方案

    local MainScene = class("MainScene", cc.load("mvc").ViewBase) MainScene.RESOURCE ...

  3. LVS单机测试不负载

    LVS单机测试不负载 1.困惑 当我们在个人PC上搭建虚拟机(Vmware)做LVS负载实验的时候,我们不论是在个人浏览器或者其他虚拟机上访问LVS的VIP都会出现上时间刷新都出现同一个页面的情况. ...

  4. GCC选项-Xlinker和-Wl区别

    写下给自己备忘,在一次使用GCC的过程中发现了原来传递给链接器ld可以同时使用Xlinker和Wl两种命令,这两个命令都可以正确传递给ld作为使用,现在总结下两者的区别. Xlinker后面跟的参数第 ...

  5. Maven项目的目录结构

    刚接触Maven没多长时间,实习时在的小公司很不规范,所有web项目都是dynamic web project搭建,没有用到项目构建,管理工具,导致了非常多的重复工作与低效. 先来看看Maven的功能 ...

  6. nl命令很好,很强大

    指令名称:     nl - 显示文件的行数及内容 语法:    nl [OPTION]... [FILE]... 说明:    将指定文件的内容附加上行数,显示到标准输出. 当没有指定文件名或使用 ...

  7. cmd 进入不同的驱动盘及上下级目录

    “开始”=>“运行”,输入”cmd“,此时进入的是系统管理员的等待命令 如果想进入相应的盘符,如 d 盘,则输入 cd d:\,然后再次输入 d: 即可进入 d: 盘,输入两次相当于第二在是询问 ...

  8. 互联网 免费的WebService接口

    winform开发暂告于段落,最近再用webservice写接口,接下来的一段时间应该偏向于此方向. (转)一批的免费webservice接口,没有技术含量,只是写在这里做个记忆 股票行情数据 WEB ...

  9. angularjs入门整理

    之前发过一篇博文,从mobile angular ui的demo和其官网初识整个angularjs的大体使用,但是没很好学习,只是通过一些技术博文初步认识,陷入很多坑.所以现在在中文官网正式整理下知识 ...

  10. Apache 禁止访问目录

    1.打开apache配置文件httpd.conf 2.找到 <Directory /> Options Indexes AllowOverride None Order allow,den ...