linux —— shell 编程(文本处理)

导读

本文为博文 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:" $1  "\tSHELL: " $7 
}
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[1]=1234
x[1000]=234234delete x  将删除数组里所有的元素删除后,可以继续定义如下:
x=567

访问环境变量: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,123
tttt  ddddddd,324
ssss  ssdd
sdfsd sdf dddd
sfdfsdf
待处理数据
BEGIN{FS="\n"RS=""    # RS设置为""将可以解析多行记录(以空行分隔)ORS=""      #输出记录分隔符不要换行
}
{x=1while(x<NF){print $x "\t"x++}print $NF "\n"
}
使用while循环

结果:

abc,123    tttt  dddd
ddd,324    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",3)
strout = sprintf("%s have %d jobs","somebody",3)

格式化输出的转义字符: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 多文件处理
10001 南京 佛挡杀佛 sdfsdf
10002 天津 发生地方  双方的发生
10003 石家庄 发生地方 发生地方
a.txt
11000,南京
11003,天津
12000,河北省
13000,品上线
12344,石家庄
b.txt
BEGIN{FS="[ ,]"OFS=","
}NR <= FNR{array[$2]=$1
}
NR > FNR{print $1,$2,array[$2]
}
join.awk
awk  -f join.awk a.txt b.txt
11000,南京,10001
11003,天津,10002
12000,河北省,
13000,品上线,
12344,石家庄,10003
执行结果

 

转载于:https://www.cnblogs.com/BensonLaur/p/6080635.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIC驱动5150遇到麻烦

搞了一天还是没有搞出来、几个问题1、不加镜头、可以检测到应答信号&#xff08;这个真的是无法解决的大BUG啊&#xff09;2、反之&#xff0c;加上镜头、检测不到应答信号&#xff08;自己猜想是不是加上镜头的时候造成电流或者电压变大或者变小了&#xff09;能不能检测到应答…

ub c语言,操作系统之LRU算法 C语言链表实现

LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段&#xff0c;用来记录一个页面自上次被访问以来所经历的时间 t&#xff0c;当须淘汰一个页面时…

四种常见的 POST 提交数据方式

四种常见的 POST 提交数据方式 文章目录 application/x-www-form-urlencodedmultipart/form-dataapplication/jsontext/xmlHTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据&#xff0…

成功驱动5150用HT68F30

用了自己写的起动总线和停止总线&#xff0c;终于可以成功 // PROGRAM : 4-17.c 2011.0521 // FUNCTION : I2C Master/Slave Mode Demo Program By Steven // Note : Configuration Option Setting-- // SIM Function Enable //void I2C_START(void); /…

VMware 虚拟机 Ubuntu 系统执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask)

可能的原因是&#xff0c;你安装了也安装了其他的虚拟机软件&#xff0c;比如&#xff1a;VirtualBox。我们打开 控制面板 > 网络和共享中心 > 更改适配器设置 &#xff0c; 你就可以打开控制面板/网络和Internet/网络连接界面&#xff1a; 直接禁用相应的网络即可&#…

sublime text3c语言编译运行,c – Sublime text 3 – 编译程序并在终端中运行

我正在使用Ubuntu 12.04,我想知道,是否有可能从终端自动运行c程序&#xff1f;当你不得不在构建控制台中使用它时,它真的很糟糕,因为有时候我会意外地创建无限循环,并且必须重新启动sublime文本再次工作.我正在使用Sublime文本3.解决方法:Sublime Text 3包含两个您可能感兴趣的…

5150晶振不起振

1、这是一个比较让我费解的问题、今天从相机输入了PAL信号、发现根本没有解码出来&#xff0c;然后检查检查&#xff0c;发现晶振不起振 解决中。。。 1、换一个板子&#xff0c;看是不是这个板子出了问题、 2、换一个起振电容 问题解决了、原因是TVP5150的PDN脚应该输入高电…

c语言us16 t,使用C ++将越南语字符编码为USASCII,ISO88591,UTF8,UTF16BE,UTF16LE,UTF16(示例代码)...

我已经编辑了我的帖子。当前&#xff0c;我正在尝试对用户的输入字符串进行编码&#xff0c;然后将其转换为每种编码格式。我可以使用Unicode完美地做到这一点&#xff0c;而且我认为输入String的格式为UTF-8。如果我的inputString是“ Hello”。但是&#xff0c;当我尝试输入“…

linux一些基础知识

linux面试题及答案 一&#xff0e;填空题&#xff1a; 1. 在Linux系统中&#xff0c;以 文件 方式访问设备 。 2. Linux内核引导时&#xff0c;从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点来标识。 4. 全部磁盘块由四个部分组成&#xff…

这本轻小说真厉害 2016

傲娇御坂美琴成轻小说女王一姐 轻小说排名公布 到了年底,作为轻小说的粉丝就没有理由不关注“这本轻小说真厉害!”的相关评选吧?腾讯动漫此前曾经报道过《OVERLORD》以及《龙王的工作》获得榜首殊荣的消息。而近日,年度的最佳作品、最佳角色以及最佳插画师等奖项也已经公布,快…

IDEA初次使用Tomcat运行项目(如何添加加载项目到Tomcat)

IDEA中Tomcat设置说明 Tomcat最好使用干净的版本 不同的版本适配不同的JDK 设置Tomcat基本信息 加载项目&#xff08;war和war exploed模式简单说明&#xff09; 配置完项目后警告消失 应用后启动 选择相应的模式即可

回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

问题&#xff1a;0/1背包问题例子:weight数组代表物品重量&#xff0c;value数组代表物品价值&#xff0c;M代表背包容量。背包是按单位价值递减的顺序排列的&#xff0c;即value[i]/weight[i]>value[i-1]/weight[i-1].const int weight[Max]{1,11,21,23,33,43,45,55};const…

ISE应用入门的一些问题

1、怎样添加IP 2、怎样用modelsim调用IP生成的仿真文件。 今天用modelsim仿真ISE生成的DDR IP IP核的地址&#xff1a;E:\FPGA\MIS607\Mis607B\update\CH09_DDR_TEST\MiS607B_DDR3_Test\DDR3_Test\ipcore_dir\mig_ddr3_control\example_design\sim\functional 所以要把modelsim…

linux模块加载和模块卸载时出现的问题

在编写驱动程序的时候有时候会出现这种情况&#xff0c;模块加载之后不能卸载或卸载之后不能在加载&#xff0c;cat /proc/devices 后发现设备还占用着设备号&#xff0c;这种情况下&#xff0c;再次加载驱动模块肯定不会成功&#xff0c;必须重新启动才可以解决。最近仔细看书…

IDEA中中文乱码问题解决方案

1.修改idea安装目录下的两个文件 C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea.exe.vmoptions C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea64.exe.vmoptions 在这两个文件下增加一行: -Dfile.encodingUTF-8 2.做此修改后,tomcat运行日志会…

linux 6.2 期末考试题,redhat6.2-linux考试试卷(带部分答案)

这个是初学redhat6.2的考试内容,带答案(实做的,水平有限,不完整答案)--------------------------------------------------------------------------------------------装 订 线-----------------------------------------------------------------------------------------广东…

ios几个重要方法

加载类到内存&#xff0c;程序刚启动的时候调用&#xff0c;调用在main函数之前 1.(void)load{} 初始化类&#xff0c;类第一次使用的时候调用一次 2.(void)initialize{ } 控制器的视图架构&#xff0c;设置控制器的根view&#xff0c;重写该方法后&#xff0c;以该方法为主&am…

C++中extern “C”含义深层探索

1.引言 C语言的创建初衷是“a better C”&#xff0c;但是这并不意味着C中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言&#xff0c;C保留了一部分过程式语言的特点&#xff08;被世人称为“不彻底地面向对象”&#xff09;&…