linux —— shell 编程(文本处理)
| 导读 |
本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) |
| 目录 |
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*]' 单词表]
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
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
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"]
| 运算符 | 描述 | 例子 |
| = += *= /= ^= **= | 赋值 | |
| ?= | 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()的种子
条件语句和循环语句与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
处理结果
在函数中,指定的参数将被当做局部变量,而所有函数体内未出现在参数列表中的变量会被视为全局性。为此,awk允许声明过多的参数用于局部使用如:
function add(x,y, sum)
{
sum = x+y
return sum
}
如果需要使用函数进行引用传递,只能通过传入数组来实现:
格式化输出:
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) | 格式化返回字符串 |
南京 佛挡杀佛 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 编程(文本处理)的更多相关文章
- linux shell编程总结
linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...
- linux shell 编程参考
#!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
- 一文学完Linux Shell编程,比书都好懂
一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...
- 前端学习 linux —— shell 编程
前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||
https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...
- linux shell 修改文本 sed
linux shell 修改文本echo [root@DSI tmp]# echo 'yhqt1 test1' > test1.txt [root@DSI tmp]# cat test1.txt ...
随机推荐
- C++语言体系设计哲学的一些随想(未完待续)
对于静态类型语言,其本质目标在于恰当地操作数据,得到期望的值.具体而言,需要: (1)定义数据类型 你定义的数据是什么,是整形还是浮点还是字符.该类型的数据可以包含的值的范围是什么. (2)定义操作的 ...
- CSS3—CSS3和现代Web设计
1.1 现代Web设计理念 1.1.1 可访问性第一 同样一段内容, 可以用成千上万的方法为其设计样式, 但全世界的用户应该依然可以访问它们, 不管他们用什么方式去访问Web——无论手机.键盘控制器还 ...
- YZOI Easy Round 2_化简(simplify.c/cpp/pas)
Description 给定一个多项式,输出其化简后的结果. Input 一个字符串,只含有关于字母x 的多项式,不含括号与分式,没有多余的空格. Output 一个字符串,化简后的多项式,按照次数从 ...
- cookie : 存储数据
cookie : 存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来像访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2.cookie的存储 ...
- html5+css3实现上拉和下拉刷新
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- Ninject 自动注册
首先这个问题我纠结了很久,看到autofac强大的自动注册功能,我感觉Ninject弱爆了,不过Ninject自带属性注册,感觉很方便,所以还在纠结Ninject 传统的绑定方式 public cla ...
- 自己使用Jquery封装各种功能分享
自己使用Jquery封装各种功能分享: 左右滚动图片 瀑布流 流动显示列表 广告切换 头像切换And广告切换 获取搜索引擎的来源关键字 上面列表中展示的功能都是使用jquery进行封装实现的,希望大家 ...
- WPF学习(二)布局与菜单、工具栏
布局 //表格①Grid//3列 4行的表格 <Grid> <Grid.ColumDefinitions> <ColumnDefinti ...
- StrongReference
原创作品:未经本人允许,不得转载前段时间写项目时遇到了一个问题,就是从网络获取图片资源的问题,总是出现OOM异常,经过几天的努力,终于处理的还算是可以使用,OOM的处理一直都是很头疼的问题.对于三级缓 ...
- vim设置
折腾一下vim http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html