当前位置: 首页 > 编程日记 > 正文

linux文本处理常用命令

linux文本处理常用命令

linux文本处理命令:grep、sed、printf、awk

1.grep

grep的作用是按行查找字符,输出包含字符的行。

#从文件查询
grep 'hello' filename.txt
#从管道的输入查询
cat filename.txt|grep 'hello'

grep使用示例:

grep的查找主要就是基于基本正则表达式的匹配,下面只是简单的给一些常用例子供参考。

grep 't[ae]st'   //查找tast或test

grep '[0-9]'   //查找数字

grep '[^a-z]oo' //查找Xoo,其中X是一个非a到z的字符

grep '^the'  //查找以the开头的字符,这里注意区分^出现在[]里时代表“非某字符”,如上个例子,出现在[]外时代表"以某字符开头",如这个例子。

grep '^$'  //查找空行

grep 'o\{2\}'  //查找两个o,这里需要注意,{}在shell里有特殊意义,因此需要转义,这里与一般的正则使用不同,需要注意。

egrep:

我们知道正则表达式分为基本正则表达式和扩展正则表达式,但是grep只支持基本正则表达式,如果要是用扩展正则表达式,需要使用egrep命令。

几个例子:

egrep 'gd|good'  //查找gd或good

egrep 'g(la|oo)d'  //查找glad或good

egrep 'A(xyz)+C'  //查找AXC,其中X是一个或一个以上的'xyz'字符串。

2.sed

sed是一个很强大的命令,可以用来做行删除行新增行选取行替换字符串的替换这5种操作。

sed是一个管道命令,可以处理管道输入。

2.1行删除

nl /etc/passwd | sed '2d'  //删除第2行

下面将省略输入管道

sed '2,5d'  //删除第2~5行

sed '3,$d'  //删除第3到最后一行,$代表最后一行

sed '/^$/d'  //删除空行

2.2行新增

sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

sed '2a a\

b\

c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行结尾加"\"即可。

2.3行选取

sed -n '5,7p'  //选取第5到7行输出,必须加-n参数,不然效果就是所有行都被输出,而5到7行输出两次。

2.4行替换

sed '2,5c No 2~5 lines'  //将第2到5行替换为一行字符串"No 2~5 lines"

2.5字符串替换

sed 's/要被替换的字符串/新的字符串/g'  //固定的格式,开头是s结尾是g,中间三个/分隔开要被替换的字符串和新的字符串,注意这里要被替换的字符串可以是正则表达式。

sed -i  's/hello/halo/g'  filename.txt

将操作结果直接写入文件

默认用sed对文件做修改之后,只是输出修改后的文件,可以用>写入到新的文件。但是如果想修改原始文件,千万不能>到原始文件,这样执行的结果就是原文件直接被清空了。想要修改原始文件可以用 -i 参数,如:

sed -i '2d' file.txt  //直接将原文件中的第二行删除。

直接修改原文件是很危险的,一旦修改错误无法还原。可以先不加 -i 参数执行命令把修改结果打印出来,确认无误后再加上 -i 参数。

#sed -i  "s/oldstring/goalstring/g" file   (要替换的字符串可以用正则表达式)
#example1 replace the /apps to /appvol at the file test.txt
sed -i "s/\/apps/\/appvol/g" test.txt#example2 replace the "apps" to "appvol"
sed -i "s/\"apps\"/\"appvol\"/g" test.txt#example3 replace the "/apps" tp "/appvol"
sed -i "s/\"\/apps/\"\/appvol/g" test.txt#example4 replace the "\apps" tp "\appvol"
sed -e "s#\"\\apps#\"\\appvol#g" test.txt

3.printf

printf这个命令用语言不太好描述,但是一动手就明白了。

把下面的内容保存为printf.txt:

Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

先cat看一下,是下面这个效果:

现在用printf指令加一些参数来看一下,执行

printf '%10s %10s %10s %10s %10s \n' `cat printf.txt`

输出结果:

是不是比cat输出的结果漂亮多了。

%10s代表这一列的宽度固定为10个字符。更多的格式就不介绍了,这篇文章我们掌握一个%10s就够了。

printf不是管道命令,要想用它处理文件必须像上面的命令那样使用`cat printf.txt`把文件内容给提出来。

printf的使用相当广泛,后面的awk命令中也会应用到printf命令。

4.awk

awk命令主要是将文件通过分隔符拆成列来处理,还能通过条件判断对不同的行进行不同的处理,甚至还可以进行数值计算~

我们也是通过例子来学习。

我们先用last命令看一下最后登录的5个用户信息:

图中的第一列是用户名,第三列是用户ip,现在我们想摘出这两列,用awk就可以做到:

last -5|awk '{print $1 "\t" $3}'

输出:

命令看起来挺复杂,不要着急,其实很简单。

首先awk使用时有固定的格式:awk '{命令}',单引号和大括号就是固定的格式而已。

然后上面的命令就是

print $1 "\t" $3    //awk默认会用空格和tab将每行分隔为N列,$1代表第一列,$3代表第三列。

这样一看是不是简单多了。

刚刚的last命令产生的数据默认就是用tab分隔的,现在我们看另一个例子,执行 cat /etc/passwd:

这次产生的数据每行是用  : 分隔的,那么想使用awk输出第一列和第三列就需要执行分隔符:

cat /etc/passwd|awk -F ':' '{print $1 "\t" $3}'    // -F ':' 代表指定使用 : 作为分隔符

执行结果:

除了$1,$3这样的特殊符号,

awk的命令中还可以使用下面的特殊符号:

NF :每一行分隔后的列数

NR :行号

下面用一个综合的例子来说明awk的条件判断和数值计算,有这样一组数据保存为pay.txt:

Name    1st   2nd   3rd
VBird   23000   24000  25000
DMTsai  21000   20000  23000
Bird2   43000   42000  41000

现在想加一列"Total",计算每一行的数值总和。

用awk可以完成这个需求:

cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

运行结果:

这里有几个要点:

  1. 加入条件判断后,awk的格式为: awk '条件1 {命令1};条件2{命令2}'
  2. 条件判断有以下逻辑运算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判断相等要用两个等号
    • !=
  3. 可以直接运算行内列的值($1、$2、$3)。
posted @ 2018-11-14 20:32 李欢欢 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lihuanhuan/p/10612133.html

相关文章:

arduino 控制无刷电机_智能控制轮椅来了,残疾人的福音!

传统的轮椅已被证明是非常宝贵的工具&#xff0c;为残疾人提供了很多便利&#xff0c;但其只能限制坐在一个位置。外国的一个研究团队通过开发一个功能强大的多功能轮椅&#xff0c;使用户能够通过手机应用程序轻松地在各种各样的位置之间进行切换。(图片来自 IC photo)这是一种…

python科学计算整理

网站&#xff1a; http://bokeh.pydata.org/gallery.html 转载于:https://www.cnblogs.com/gogly/p/3453341.html

TP-link 841N 刷DD-WRT固件

2012年4月20号 今天&#xff0c;笔者逛“太平洋”的时候&#xff0c;发现了一个关于TP-Link 840N刷DD-WRT的帖子&#xff0c;进去逛了一会&#xff0c;突然记得自己家中的那个路由好像也是这个型号的&#xff0c;二话不说&#xff0c;果断收录这条资料&#xff0c;并把所需要的…

网格的铺设问题——骨牌

Problem Description 有一个大小是 2 x n 的网格&#xff0c;现在需要用2种规格的骨牌铺满&#xff0c;骨牌规格分别是 2 x 1 和 2 x 2&#xff0c;请计算一共有多少种铺设的方法。 Input 输入的第一行包含一个正整数T&#xff08;T<20&#xff09;&#xff0c;表示一共有 T…

C++智能指针:weak_ptr实现详解

文章目录weak_ptr描述声明作用原理实现函数成员使用总结weak_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a;template <class T> class weak_ptr 声明方式&#xff1a;std::weak_ptr<type_id> statement 作用 根据boost库的官方描述&#…

在PHP中使用全局变量的几种方法

简介即使开发一个新的大型PHP程序&#xff0c;你也不可避免的要使用到全局数据&#xff0c;因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有&#xff1a;程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据&#xff0c;其中最常…

python处在哪个阶段_python 基础复习

1、简述cpu、内存、硬盘的作用cpu(1)cpu&#xff1a;处理逻辑运算、算术运算(2)cpu&#xff1a;接受指令传给电脑硬件&#xff0c;让其运行内存&#xff1a;(1)内存&#xff1a;从硬盘中读取数据&#xff0c;供其cpu调取指令运行&#xff0c;短暂的存贮数据&#xff1b;运行速度…

android用户界面之WebView教程实例汇总

一、WebView教程1.Android---UI篇---WebView&#xff08;网络视图&#xff09;http://www.apkbus.com/android-14259-1-1.html2.webview学习记录http://www.apkbus.com/android-44567-1-1.html3.Android中使用WebView, WebChromeClient和WebViewClient加载网页http://www.apkbu…

java下输出中文的一点研究

网上或者大部分书上都说Java中输出中文使用FileReader类就可以了&#xff0c;但是当你读取一个中文文档时&#xff0c;你会发现&#xff0c;除了乱码&#xff0c;还是乱码。究其原因&#xff0c;这其实是文件流读取时使用的编码方式和文件本身编码方式不同,造成读取出来文件乱码…

C++智能指针:unique_ptr详解

文章目录unique_ptr描述声明作用函数指针描述总结unique_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a; 默认类型template <class T, class D default_delete<T>> class unique_ptr数组类型template <class T, class D> class uniq…

川崎机器人示教盒维修_专业维修丹阳市KUKA库卡KRC2库卡C4主板维修{苏州罗韦维修}...

发那科机器人故障分析 发那科伺服放大器上LED指示灯故障维修大全_发那科机器人维修&#xff0c;FANUC机器人保养&#xff0c;伺服电机示教器减速器维修&#xff0c;驱动器维修&#xff0c;苏州发那科机器人维修&#xff0c;本文主要介绍了发那科伺服放大器上因故障而出现的各种…

js 文本反向排列显示

一次面试遇到这样的题目 反向输出“how are you” 解决方法 <script language"JavaScript">var message1"how are you";var message2"";for (countmessage1.length; count > 0; count--)message2message1.substring(count,count-1);doc…

2012年12月4期手机网页开发

最近主要做手机上页面的开发&#xff0c;主要框架是&#xff0c;手机安装客户端&#xff0c;加载主站手机应用页面&#xff0c;手机客户端配合主站功能实现本地扫描或重力感应的效果。 针对安卓系统&#xff0c;在开发和调试时发现如下问题&#xff1a;1路径错误&#…

zabbix4.0构建实录

【Nginx】 #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [rootcentos ~]# yum -y install zlib pcre pcre-devel openssl openssl-devel[rootcentos ~]# useradd -s /sbin/nologin nginx [rootzabbix-server ~]# yum install -y nginx 【M…

ceph-kvstore-tool 工具使用详解

文章目录简介使用总结简介 ceph-kvstore-tool工具是用来获取存放在leveldb或者rocksdb数据库中的键值元数据。并且该工具能够对kvstore中的数据进行配置&#xff0c;就像是对离线后的osd操作osd map一样 使用该工具&#xff0c;需要安装ceph-test-12.2.1.06-0.el7.centos.x86_…

springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

一、前言在某些情况下&#xff0c;由于网速慢&#xff0c;用户操作有误(连续点击两下提交按钮)&#xff0c;页面卡顿等原因&#xff0c;可能会出现表单数据重复提交造成数据库保存多条重复数据。存在如上问题可以交给前端解决&#xff0c;判断多长时间内不能再次点击保存按钮&a…

智能会议白板系统每日开发记录

智能会议白板系统&#xff0c;在开发过程中&#xff0c;整个项目期限内&#xff0c;每月&#xff0c;每周&#xff0c;每天要做的事情&#xff0c;作为组长的记录&#xff0c;多有不足之处&#xff0c;望指点。 转载于:https://www.cnblogs.com/mayijun/p/3458039.html

java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出&#xff0c;解决方法也一定是加大内存。说说为什么会内存益出&#xff1a;这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入Per…

ceph-dencoder工具使用详解

文章目录简介使用decode命令用法encode简介 ceph-dencoder工具是一个序列化编码、解码并且打印ceph数据结构的工具。它主要用来调试和测试ceph不同版本之间的兼容性问题 该工具是由 ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成 本文章是根据ceph-12.2.1版本来描述改…

EBS fnd_global.apps_initialize

原型&#xff1a;fnd_global.apps_initialize(user_ID, Responsibility_id,Responsibility_application_id);作用&#xff1a;在数据库的会话中设置全局变量&#xff0c;和用户概要信息。参数获得&#xff1a;参数一&#xff0c;用户ID select user_idfrom fnd_userwhere user_…

js判断鼠标靠近屏幕最侧面的监听_threejs按鼠标位置缩放场景

threejs的orbitcontrol&#xff0c;默认的缩放模式为整体以target为中心进行缩放。有时候&#xff0c;我们想让场景按照鼠标位置进行缩放&#xff0c;体验起来就和地图的缩放一样&#xff0c;最直观的感觉就是整个场景会越来越靠近鼠标点的位置&#xff0c;而不是整体的缩放大小…

hibernate中多对多分解成一对多,

1&#xff0c;参考&#xff1a;http://blog.csdn.net/yaerfeng/article/details/6969632

C++ 函数参数 值传递与引用传递

以前我们在C语言中函数参数传递过程中&#xff0c;如果我们想要让当A函数作用域中的变量经过B函数处理之后的数值仍然在A函数中生效&#xff0c;这个时候函数参数的传递时需要引用方式去传递&#xff0c;方式如下&#xff1a; #include <stdio.h> //函数参数为指针&…

SharePoint 2013 图文开发系列之代码定义列表

在SharePoint的开发中&#xff0c;用Visual Studio自定义列表是经常会用到的&#xff0c;因为很多时候&#xff0c;我们并不会手动创建列表&#xff0c;而手动创建列表在测试服务器和正式机之间同步字段&#xff0c;也很麻烦&#xff0c;所以我们经常用代码来定义列表或者文档库…

arduino下载库出错_【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用...

微信关注 “DLGG创客DIY”设为“星标”&#xff0c;重磅干货&#xff0c;第一时间送达。arduino特点库超多&#xff0c;想必大家都领教了&#xff0c;今天来分享一下之前玩过的TRMpcm库。这个库是干嘛用的&#xff1f;简单粗暴用arduino(这里特指arduino官方那几个板子uno、nan…

vim替换技巧4

、 转自&#xff1a;http://www.confay.com/2008/03/vim4.html [技巧一] 第一个是在VIM邮件列表中看到的&#xff0c;给出了一个如何统计文章字数的方法。 统计一个完整文件的字数&#xff0c;可以使用Unix下的wc工具&#xff0c;它能够统计一个文件的行数、单词数和字符数。 如…

spark1.x和2.xIterable和iterator兼容问题

1. spark 1.x 升级到spark 2.x 对于普通的spark来说,变动不大 : 1 举一个最简单的实例:spark1.x public static JavaRDD<String> workJob(JavaRDD<String> spark1Rdd) {JavaPairRDD<String, Integer> testRdd spark1Rdd.flatMapToPair(new PairFlatMapFunct…

C++ 拷贝构造函数和重载赋值运算符的区别

文章目录拷贝构造函数重载赋值运算符赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成&#xff0c;而拷贝构造函数会生成新的对象。 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别&#xff0c;将详细通过代码展示两者之间得差异。 拷贝构造函数 首先…

单元格内多个姓名拆分成一列_EXCEL拆分单元格中的姓名,这都不叫事儿

作者&#xff1a;祝洪忠 转自&#xff1a;Excel之家ExcelHome小伙伴们好啊&#xff0c;今天老祝和大家来分享一个数据整理的技巧。下面的表格形式&#xff0c;想必大家不会陌生吧&#xff1a;在这个表格内&#xff0c;同一个部门的人员名单都挤到一个单元格内。现在问题来了&am…

3.1 A Historical Perspective 历史观点

1.从1978年的8086到现在的2008年core i7 ,从29K个晶体管到781M个晶体管&#xff0c;地址线&#xff08;也叫地址位长&#xff08;bit long))8086只有20个地址线&#xff0c;1982年&#xff0c;MS-windows 使用80286平台开发了自己的windows。直到1985年&#xff0c;i386正式扩展…