c++清空一个txt文本_Linux下常用文本处理命令大全
Linux中很多文本工具都使用到了正则表达式,正则表达式可以极大的简化linux系统管理工作,因为网上有很多正则相关的教程,所以这里不再讲述,我当时看的是菜鸟的正则表达式,看个一下午在实验几遍基本就会了,除了正向肯定预查,反向肯定预查这几个比较复杂一些,其他都是非常简单的,很多时候记不住也可以查询网上对着写,并不需要你实时记住。这里主要谈谈awk等用到正则表达式的文本处理工具。
一、awk
awk的指令必须包含在单引号中。
基本句式
awk -F'指定输入分隔符' 'BEGIN{做一些初始化工作} 一些过滤条件 {针对每行的工作}... END{最后收尾工作}'
中间的处理块可以有多个,通过过滤条件单每行都会走一遍过滤条件,其中BEGIN和END边只会执行一遍
过滤记录
- awk '$3==0 && $6=="LISTEN" ' netstat.txt
- awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt
指定分隔符
- awk -F: '{print $1,$3,$6}' /etc/passwd等价于awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
- awk -F '[;:]' 指定多个分隔符
- awk -F: '{print $1,$3,$6}' OFS="" /etc/passwd指定输出分隔符
需要注意的是上面print $1,$3,$6中的,被替换成了分隔符,如果是print $1$3$6则中间没有分隔符
特殊关键字:
- NR 目前处理的行号
- NF 当前处理的行一共用到的字段数目
- FNR 目前处理的文件的行号(当处理多个文件时,NR会不停的累加,但如果是FNR则在处理新文件是从1开始)
- FILENAME 文件名
- $0 当前整行
- FS 输入字段分隔符 默认是空格或Tab
- RS 输入记录分隔符 默认为换行符
- OFS 输出字段分隔符 默认是空格或Tab
- ORS 输出记录分隔符 默认为换行符
正则
- 普通匹配: awk'/hello/ {print}' test.sh
- 匹配取反: awk '!/hello/ {print}' test.sh
- 同时匹配: awk '/hello/ && /world/ {print}' test.sh
- 或者匹配: awk '/hello/ || /world/ {print}' test.sh 也可以写成awk '/hello|world/ {print}' test.sh
- 指定列匹配: awk '$5 ~ /hello/ {print}' test.sh
- 指定列匹配取反: awk '$5 !~ /hello/ {print}' test.sh
输出到不同的文件
- $ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.txt
- awk 'NR!=1{print > $6}' netstat.txt
其实使用了 >重定向,上例子使用了if语句
- 统计数据: awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
- 行数筛选,开头和结尾的条件使用,分隔: awk '/test1/,/test2/ {print}' test.txt
和环境变量的交互
$ x=5 $ y=10$ export y $ echo $x $y5 10$ awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="" score.txtMarry 2143 78 89 87Jack 2321 66 83 55Tom 2122 48 82 81Mike 2537 87 102 105Bob 2415 40 62 72
二、grep
参数列表:
- -w 匹配整个单词
- -s 忽略文件不存在等报错
- -l 仅列出匹配文件列表
- -L 仅列出不匹配文件列表
- -A 显示后的行数 如-1 匹配行的后1行
- -B 显示前的行数 如-1 匹配行的前1行
- -number 显示前后的行数 如-1 匹配行的前后1行
- -n 打印行数
- -c 仅显示个数
- -v 反向
- -o 仅显示匹配的内容
- -E 则表示要使用EREs
- -P 则表示要使用PREs
grep主要就是一个正则表达式的使用,其中需要注意正则有三种BREs、EREs和PREs。前两种不支持非贪婪匹配。grep默认是BREs,所以他?,+,|,{,},(,)这种字符都需要用转义,另外他不支持s,S,D,d,等字符。
三、sed
sed命令在自动化脚本编写的过程还是经常用到的。
基本句式: sed -nfei [操作]
操作: n1,n2 动作
动作:
- d: 删除
- s: 替换,行内替换,行内匹配的字符串,如hello world该行替换hello为hi变成hi world
- a和i: a增加在匹配的后面增加行 i增加在匹配的前面增加行
- c :替换,针对整行替换
例子:
- sed -e 's/hello/hi/g':替换文本,-e可以省略
- sed -e '1,2s/hello/hi/g' -e '3,4s/world/man/g:等价于sed -e '1,2s/hello/hi/g;3,4s/world/man/g
- sed s/hello (world)/1 hi/g':群组匹配,可以使用选择前面的群组
四、sort和uniq
sort参数
- -r: 默认升序,-r表示反序
- -u: 移除重复
- -o: 重定向到文件,注意sort test.txt >test.txt不可用,因为> 是想清空文件,所以会导致文件在排序之前就清空了
- -n: 默认按字符排序,如10小于2,-n表示按数字排序
- -t: 指定分隔符
- -k: 指明用哪一列来做排序
- -b: 忽略每行前面开始出的空格字符
例子:
- sort -t $'' -k 1 -u res.txt > res2.txt 以tab作为分隔符,按第一列排序并去重
uniq参数
需要注意uniq需要文本是有序的,所以一般使用uniq的时候是用更早sort的管道后面
- -c:显示出现的次数
- -d:仅显示重复出现行;
- -u :仅显示出一次的行列;
说说sort|uniq 和sort -u,一直觉得很奇怪,两者有什么区别,功能是一样的。sort -u是后面加入的,所以很多人还是使用了sort|uniq,目前推荐使用sort -u,因为还少了进程间通讯。
五、实战
处理以下文件内容,将域名取出并进行计数排序,如处理:
http://www.baidu.com/index.htmlhttp: / / www.baidu.com/1.htmlhttp://post.baidu.com/index.htmlhttp://mp3.baidu.com/index.htmlhttp://www.baidu.com/3.htmlhttp://post.baidu.com/2.html得到如下结果:3 www.baidu.com2 post.baidu.com1 mp3.baidu.com
解法1:grep -Po '(?<=//)(.*?)(?=/)' test.txt |sort |uniq -c|sort -nr
1.利用了Perl,他支持非贪婪,2.利用了正向和反向预查(正向预查是后面的(?=)) 3.利用了-o参数只输出匹配的内容
解法2:awk -F/ '{print $3}' test.txt |sort |uniq -c|sort -nr
指明了分割符号 直接取对应值
解法3:sed 's/http://([^/]*).*/1/' test.txt|sort |uniq -c|sort -nr
基本的正则中小括号需要转义,如果采用-r参数即扩展的正则小括号不用转义
解法4: sed -e 's/http:' -e 's//.*//' | sort | uniq -c | sort -rn
采用了替换,先替换前面的,在替换后面的
awk例子
需要注意awk不支持多维数组,采用了一种变通的方式,普通的使用没问题,但是如果需要存的值是一个map就不合适了,如下文件 1-6列分别为deal od sum up lj day ,现在要计算sum up lj day 的累加和输出输出也要是deal od sum up lj day也就是sum up lj day需要是一个map,不过awk做不到这点
{ updealids:{ od: {day,sum,up,lj} }}awk 'BEGIN{OFS=""}{result[$1,$3,"sum"]+=$4;result[$1,$3,"up"]+=$5;result[$1,$3,"lj"]+=$6;result[$1,$3,"day"]=$2}END{for ( i in result) {split(i, a, SUBSEP); print result[i] ,a[1], a[2], a[3] }}' *
c++清空一个txt文本_Linux下常用文本处理命令大全相关推荐
- window下常用的doc命令
本文为转载,转载地址:http://blog.csdn.net/franktan2010/article/details/36456501 window下常用的doc命令 dir 用来显示一个目录下的 ...
- linux下常用的关机命令有:shutdown、halt、poweroff、init;重启命令有:reboot。下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法。
linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法. 原创未通过审 ...
- DOS下常用网络相关命令解释(华为培训资料)
DOS下常用网络相关命令解释 深圳市华为技术有限公司 华为技术 第一章引言 1. 概述 在我们的工作之中经常要和网络打交道而win95/98或是NT又是较常用的操 作系统在使用这些操作系统过程中使用频 ...
- DOS下常用BAT(cmd)命令
DOS下常用BAT(cmd)命令 在cmd中不显示命令行却显示结果 使用 @echo off @echo off rem off之后ping命令行不会显示在cmd上,结果会在cmd上显示 ping 1 ...
- linux下常用的关机命令
linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法. 首先来看一下 ...
- Android系统在超级终端下必会的命令大全
Android系统在超级终端下必会的命令大全 BusyBox 是标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的 ...
- linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt
[2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...
- 最常用的CURL命令大全
为什么80%的码农都做不了架构师?>>> 日期:2012-6-10 来源:GBin1.com cURL是 一个非常实用的命令行工具,可以有效的帮助你处理URL相关操作和数据传 ...
- 【分享】Oracle 常用运维命令大全
教材下载 ORACLE OCP 19C 官方电子教材 ORACLE OCP 12C官方电子教材 课程介绍 DBA数据库管理必备认证:ORACLE OCP 19C Oracle 常用运维命令大全 一.o ...
最新文章
- 第五次作业:四则运算之升级
- 思科生成树命令之debug spanning-tree(本文转载自:www.91ccie.coml
- android shape.xml 文件使用
- 【通知】有三AI更新420页14万字视觉算法工程师成长指导手册,可下载收藏打印...
- HQL中出现XXX is not mapped的错误
- 安装 VMware Workstation Pro 16 并创建 ubuntu 20.04 虚拟机
- Video Game Troubles(有依赖的背包)
- 动态规划 HDU1231-------最大连续子序列
- free mybatis 不生效_2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
- 传感与检测实验报告,差动变压器的特性测定,江南大学物联网自动化
- 读书笔记--Android Gradle权威指南(上)
- Pentium 4处理器架构/微架构/流水线 (12) - 微架构框图
- “寒门状元之死”文章引热议 京东徐雷:三流文学作品 多看书吧
- 运行后闪退_好消息好消息,王者荣耀闪退问题苹果也修复啦
- docker 打包部署 python项目_Docker如何部署Python项目的实现详解
- linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比
- JAVA判断数组最大值
- python函数参数顺序_对Python中函数参数类型及排序问题,三个方面的总结
- 聊天软件开发_3_数据库表设计
- SlideLive:提供时间线类型PPT模板下载
热门文章
- 阿里开发者招聘节 | 面试题05: 关于epoll和select的区别,哪些说法是正确的?
- Redis 巧用数据类型实现亿级数据统计
- 探索处理数据的新方法,8 个重点带你搞懂云数据库——DBaaS(数据库即服务)到底是什么!...
- 打破多项世界记录 双11背后最大的力量是技术
- 腾讯云连续三年登上KVM开源贡献榜,引领KVM技术标准!
- 你知道哪些情况下不该使用深度学习吗?
- 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
- java并发condition_Java并发之Condition的实现分析
- docker jfrog-oss
- Springboot2.x +JPA 集成 Apache ShardingSphere 同库分表