Linux常用文本处理工具总结备忘(grep,awk,sed,cut...)

1. grep

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

日常用法:

$ grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的行数
-i :忽略大小写,即大小写视为相同
-n :顺便输出行号
-v :反向选择,即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

tips: grep -c 的作用类似grep | wc -l,不同的是,如果是查找多个文件,grep -c会统计每个文件匹配的行数,每行一个文件的列出来,而wc -l 则列出总的统计数字。

将/etc/passwd,有出现 root 的行取出来

$ grep root /etc/passwd
或
$ cat /etc/passwd | grep root 

将/etc/passwd中,没有出现 root 和nologin的行取出来

$ grep -v root /etc/passwd | grep -v nologin

用 dmesg 列出核心信息,再以 grep 找出包含 eth 那行,关键字所在行的前两行与后三行也一起显示出来

$ dmesg | grep -n -A3 -B2 --color=auto 'eth'

根据文件内容递归查找目录

#在当前目录搜索带'energywise'行的文件
$ grep ‘energywise’ *

#在当前目录及其子目录下搜索'energywise'行的文件
$ grep -r ‘energywise’ *

#在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
$ grep -l -r ‘energywise’ *

正则表达式搜索:

grep '正则表达式' regular_express.txt

2. awk

awk把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法:

awk 'pattern{action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 awk 在数据中查找的内容(正则表达式,用斜杠括起来),而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

通常,awk以文件的一行为处理单位。awk每接收文件的一行,然后执行相应的命令,来处理文本。

例1:

cat file | awk  '{print $1}'

awk工作流程:读入由’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域(默认域分隔符是”空白键” 或 “[tab]键”),填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。以上命令将打印第一个域。

例2:

#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'

以’:’为分隔符,打印第1和第7个域,两者用tab分隔。

例3:

$cat /etc/passwd |awk  -F ':'  'BEGIN {print "name\tshell"}  {print $1"\t"$7} END {print "blue\t/bin/nosh"}'
name    shell
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh
....
blue    /bin/nosh

以’:’为分隔符,打印第1和第7个域,两者之间以tab分隔,而且在所有行添加列名name\tshell,在最后一行添加”blue\t/bin/nosh”。

例4:

$ awk -F: '/root/{print $7}' /etc/passwd  

搜索/etc/passwd有root关键字的所有行,并显示第7个域。匹配了pattern(这里是root)的行才会执行action(没有指定action,则默认输出每行的内容)。

例5:

df | awk '$4>1000000 '

显示第4个域满足条件的行。

awk '$1 == "Chi" {$3 = "China"; print}' file        

找到匹配行后先将第3个域替换后再显示该行(记录)。

awk内置变量

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

print和printf

awk同时提供了print和printf两种打印输出的函数。

print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

$ awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

使用printf替代print,可以让代码更加简洁,易读

$ awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

其中%s表示输出的是字符串,%10s表示字符串至少占10格(不足10格则补空格),且右对齐(左对齐则使用%-10s)

3. sed

命令格式

$ sed [-hnV][-e<script>][-f<script文件>][文本文件]

选项options:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。

动作:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除, d 后面通常不接任何其他内容;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法。

在testfile文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:

$ sed -e 4a\newLine testfile 

将 /etc/passwd 的内容列出并且打印行号,同时,请将第 2~5 行删除:

$ nl /etc/passwd | sed '2,5d'

删除第 3 到最后一行:

$ nl /etc/passwd | sed '3,$d' 

将第2-5行的内容取代成为『No 2-5 number』:

$ nl /etc/passwd | sed '2,5c No 2-5 number'

通过这个方法就能够将数据整行取代。

删除/etc/passwd所有包含root的行,其他行输出:

$ nl /etc/passwd | sed  '/root/d'

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把root替换为jiange,再输出这行:

$ nl /etc/passwd | sed -n '/root/{s/root/jiange/;p;q}'    

p是打印,q是退出。

sed 的搜寻与替代的与 vi 相当的类似:

$ sed 's/要被取代的字串/新的字串/g'

先观察原始信息,利用 /sbin/ifconfig 查询 IP

$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....

本机的ip是192.168.1.100。
将 IP 前面的部分予以删除:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
将 IP 后面的部分予以删除:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

替换一个或多个空格为逗号:

cat word.txt | sed 's/[ ][ ]*/,/g'

脚本说明:
s代表替换指令;
每个[ ]都包含有一个空格;
*号代表0个或多个;
g代表替换每行的所有匹配;

第一个[ ]表示至少要有一个空格,第二个[ ]加上*表示0个或多个空格,因此[ ][ ]*表示一个或多个空格。

4. cut

cut是一个选取命令,以行为单位,用指定分隔符将行切分为若干字段,选取所需要的字段。

语法格式:

cut [option] files

option常用参数如下:

-d:用来定义分隔符,默认为tab键,一般与-f配合使用(如果分隔符是空格,必须是两个单引号之间有一个空格)
-f:需要选取的字段,根据-d切分的字段集选取,下标从1开始
-s:表示不包括那些不含分隔符的行,用于去掉注释或者标题一类的信息
-c:以字符为单位进行分割,可以选取指定字符
-b:以字节为单位进行分割,可以选取指定字节,这些字节位置将忽略多字节字符边界(比如:汉字),除非同时指定了-n参数
-n:取消分割多字节字符,只能和-b参数配合使用,即如果字符的最后一个字节落在由-b参数列表指定的范围之内,则该字符将被选出,否则,该字符将被排除。

不难看出上面参数中,-f、-c、-b都是用来表示提取指定范围数据的,这个范围的表示方法如下:

N:只取第NN-:从第N项一直到行尾
N-M:从第N项到第M项(包括M项)
-M:从第一项到第M项(包括M项)
-:从第一项开始到结束的所有项

例子1:

$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/changquan.scq/bin

#选取第2个路径:
$ echo $PATH | cut -d: -f2
/usr/local/bin

#选取第2到第4个路径,包括第4个路径:
$ echo $PATH | cut -d: -f2-4
/usr/local/bin:/bin:/usr/bin

#选取第1个路径和第3个路径:
$ echo $PATH | cut -d: -f1,3
/usr/kerberos/bin:/bin

#选取第1到第3个路径和第5个路径:
$ echo $PATH | cut -d: -f1-3,5
/usr/kerberos/bin:/usr/local/bin:/bin:/home/changquan.scq/bin

例子2:

$ who
changquan.scq pts/02014-05-13 16:21 (10.62.50.159)
changquan.scq pts/12014-05-13 17:53 (10.62.50.159)
changquan.scq pts/22014-05-13 18:09 (10.62.50.159)

#提取每一行的第3个字符:
$ who | cut -c3
a
a
a

#提取第1个字符开始到第3个字符,包括第3个字符:
$ who | cut -c-3
cha
cha
cha

5. split

根据行拆分

每3行拆分成一个文件,拆分后的文件名以name开头,以数字作为后缀后缀长度为1

$ split -l 3 test -d -a 1 name
$ ls
name0   name1   name2   test

按字节进行拆分

每三个字节拆分成一个文件,默认不加单位就是字节,也可以带单位比如KB,MB等

split -b 3 test -d -a 1 new
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值