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 ...
随机推荐
- 理解java Web项目中的路径问题
本文以项目部署在tomcat服务器为例,其他相信也是一样的. 先说明请求页面的写法,在web中,页面路径主要写的有以下几种 1.请求重定向 2.浏览器的请求被服务器请求到新页面(我称为“转发”) 3. ...
- 召回率与准确率[ZZ]
最近一直在做相关推荐方面的研究与应用工作,召回率与准确率这两个概念偶尔会遇到,知道意思,但是有时候要很清晰地向同学介绍则有点转不过弯来. 召回率和准确率是数据挖掘中预测.互联网中的搜索引擎等经常涉及的 ...
- Fibonacci 数列递归 重复计算
public class Fibonacci{ public static long F(long n){ System.out.println("call F" + n); ) ...
- uniq和sort的用法
uniq和sort都是按行操作的linux命令. sort按文本行排序,如下所示的log文件:直接sort log即可将其排序. 容易忽略的是sort -n命令,在如下例子中将看到 如果直接sort则 ...
- KMP算法——字符串匹配
正直找工作面试巅峰时期,有幸在学校可以听到July的讲座,在时长将近三个小时的演讲中,发现对于找工作来说,算法数据结构可以算是程序员道路的一个考量吧,毕竟中国学计算机的人太多了,只能使用这些方法来淘汰 ...
- Windows phone 之独立存储
独立存储命名空间的说明:
- python 计算apache进程占用的内存大小以及占物理内存的比例
目的:计算所有apache进程占用的内存大小以及占物理内存的比例: 思路:利用系统中/proc/meminfo的现有数据进行统计 1.pidof列出服务对应进程的PID [root@yanglih ...
- 如何在Webstorm中添加js库 (青瓷H5游戏引擎)
js等动态语言编码最大的缺点就是没有智能补全代码,webstorm做到了. qici_engine作为开发使用的库,如果能智能解析成提示再好不过了,经测试80%左右都有提示,已经很好了. 其他js库同 ...
- phpexcel的写出操作(生成excel表)
/* thinkphp3.2 ThinkPHP/Library/Org/Util/ 放置位置 http://files.cnblogs.com/files/youligai/phpexcel.zip ...
- 把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用
今天写了一个小例子,把字符串里面的所有小写字母全部转换成大写字母http://blog.csdn.net/yasaken/article/details/7303903 1 #include &quo ...