导读 |
本文为博文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 编程(编程语法)
导读 本文为博文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 ...
-
linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行
linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行 crontab每分钟执行一次,但5秒以上才有更新数据,有时候一分钟可能跑不完上一个进程,需要先等10秒再判 ...
-
Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
随机推荐
-
git推送本地分支到远程分支
场景 有时候我们开发需要开一个分支,这样可以有效的并行开发. 开分支有两种方式: 一种是在远程开好分支,本地直接拉下来; 一种是本地开好分支,推送到远程. 远程先开好分支然后拉到本地 git chec ...
-
KSFramework常见问题:Lua脚本热重载,内存状态数据丢失?
Lua热重载 内存数据在重载后会丢失 KSFramework中,所有的UI Lua脚本是可以重载的.脚本中的一些内存数据,在重载后会丢失,比如: -- 记录一个UI界面被打开了多少次 function ...
-
静态成员变量.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
-
php 内置的 webserver 研究。
今天,试了一下通过 php5.4.45 内置的webserver , 在Windows XP 上面能够跑起公司的一个项目,完全无压力.哈哈,只要一个php 就可以,不需要 Apache , Nginx ...
-
CPP笔记_泛型编程简单总结
本篇是基于<Essential C++>第三章泛型编程风格的一个简单总结 1 Iterator vector<string>::iterator 表明此iterator是位于 ...
-
[UOJ 282]长度测量鸡
Description
-
MySQL 性能优化的最佳20多条经验分享(收藏)
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...
-
布隆过滤BitMap原理
一.问题引入 BitMap从字面的意思,很多人认为是位图,其实准确的来说,翻译成基于位的映射,怎么理解呢?举一个例子,有一个无序有界int数组{1,2,5,7},初步估计占用内存44=16字节,这倒是 ...
-
SpringBoot2 【关于:Table &#39;XXX.hibernate_sequence&#39; doesn&#39;t exist】
将ID生成略组改成@GeneratedValue(strategy = GenerationType.IDENTITY).
-
POJ 1459 &;amp;&;amp; ZOJ 1734--Power Network【最大流dinic】
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 25108 Accepted: 13077 D ...