【Linux】linux中文本操作利器grep,awk,sed

时间:2022-09-02 15:21:36

grep命令


grep(global search regular expression)是一种强大的文本搜索工具,它可以使用正则表达式搜索文本,并把匹配的行打印出来。平时搜索文本中内容的时候是非常方便的。

格式:

grep [option] pattern filename

主要选项:

  • -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
  • -o 只输出文件中匹配到的部分。
  • -v 反转查找。
  • -i 忽略字符大小写的差别。
  • -E 使用扩展正则表达式。
  • -c 计算匹配到的列数。
  • -n 列出匹配到的行号。
  • -s 不显示错误信息。

 案例:

在passwd文件中找到包含root的行

[root@localhost rabbitmq-c]# grep root /etc/passwd
root:x:::root:/root:/bin/bash
operator:x:::operator:/root:/sbin/nologin

列出行号

[root@localhost rabbitmq-c]# grep -n root /etc/passwd
:root:x:::root:/root:/bin/bash
:operator:x:::operator:/root:/sbin/nologin

多个文件中搜索

[root@localhost rabbitmq-c]# grep -n root /etc/passwd /etc/shadow
/etc/passwd::root:x:::root:/root:/bin/bash
/etc/passwd::operator:x:::operator:/root:/sbin/nologin
/etc/shadow::root:$$xlxl/3ch$XPvzGYnvC.jk5y7NvQcbNO/8RZ6pLCFvFi79ceS7fXbffKEHG1tfRw

s参数忽略错误提示

[root@localhost rabbitmq-c]# grep -ns root /etc/*
/etc/aliases:12:postmaster: root
/etc/aliases:15:bin: root
/etc/aliases:16:daemon: root
/etc/aliases:17:adm: root

统计匹配倒的行数

[root@localhost rabbitmq-c]# grep -nsc root /etc/passwd

大C参数匹配结果的前2行和后2行

[root@localhost rabbitmq-c]# grep -nsC   root /etc/passwd
:root:x:::root:/root:/bin/bash
-bin:x:::bin:/bin:/sbin/nologin
-daemon:x:::daemon:/sbin:/sbin/nologin
--
-halt:x:::halt:/sbin:/sbin/halt
-mail:x:::mail:/var/spool/mail:/sbin/nologin
:operator:x:::operator:/root:/sbin/nologin
-games:x:::games:/usr/games:/sbin/nologin
-ftp:x:::FTP User:/var/ftp:/sbin/nologin

满足多个关键字

[root@localhost ~]# ls /usr/local/mysql/data/oa_2018/ | grep -E "yunwei_log|workflow_order"
workflow_order.ibd
yunwei_log.ibd

sed命令


linux中的sed是一种流处理编辑器,它是文本处理中非常中的工具。它可以对文本进行增加,删除,替换的处理。

处理时需要一个文本或者管道输入,然后读取当前处理的行存储在模式空间(pattern space)也就是一个临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件本身的内容并没有改变,除非将结果重定向存储输出。

sed操作过程:

sed有个文本选定的过程,就是用正则选定文本,选定了可以处理的行之后,才会正真的调用sed命令去操作。

sed命令格式:分两种

命令行格式:

sed [options] 'command' file(s)

脚本格式:

sed [options] -f scriptfile file(s)

选项[options]:

  -n或--quiet或——silent:仅显示script处理后的结果;

  -e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;

命令(command): 行定位(正则)+ sed命令。

p  打印模板块的行。
       P (大写) 打印模板块的第一行。

sed用法实例

示例1. p参数打印文件

[root@localhost ~]# sed 'p' /etc/passwd
root:x:::root:/root:/bin/bash
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
bin:x:::bin:/bin:/sbin/nologin
......

每一行都打印了两遍,因为sed命令原理是读入一行打印一行,这里加上p参数又打印了一行。

加上n参数就会打印相关的行,所以就不会显示重复的行。

[root@localhost ~]# sed -n 'p' /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
.......

一般-p参数都会和n一起使用。

sed行定位(选择要处理的行,可以通过正则匹配)

     定位一行: x;(x代表行号)    /pattern/ (正则)

[root@localhost oa]# sed -n '5p' passwd
lp:x:::lp:/var/spool/lpd:/sbin/nologin [root@localhost oa]# nl passwd | sed -n '5p' 也可以用nl命令打印出行号
lp:x:::lp:/var/spool/lpd:/sbin/nologin

通过正则打印包含关键字的行,下面就是打印包含mysql的行。

[root@localhost oa]# sed -n '/mysql/p' passwd
mysql:x::::/home/mysql:/bin/bash

定位几行:x,y; (x y都是行号,表示一个区间,x行到y行)      /pattern/,x; (正则表示法,x和y都可以用正则表示)

打印5行到15行。

[root@localhost oa]# nl passwd | sed -n '5,15p'
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
games:x:::games:/usr/games:/sbin/nologin
ftp:x:::FTP User:/var/ftp:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin

用正则来取范围

[root@localhost oa]# nl passwd | sed -n '/lp/,/dbus/p'
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
games:x:::games:/usr/games:/sbin/nologin
ftp:x:::FTP User:/var/ftp:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin

取反操作,比如不显示5-15行

[root@localhost oa]# nl passwd | sed -n '5,15!p'
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin 这里5到15行就没选择
polkitd:x:::User for polkitd:/:/sbin/nologin
abrt:x::::/etc/abrt:/sbin/nologin
unbound:x:::Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:::usbmuxd user:/:/sbin/nologin
.........

定位间隔几行:first ~ step (first代表起始行号,step代表间隔几行,步长是多少)。

[root@localhost oa]# nl passwd | sed -n '1~5p'    下面是从第一行开始每间隔5行输出一行
root:x:::root:/root:/bin/bash
sync:x:::sync:/sbin:/bin/sync
games:x:::games:/usr/games:/sbin/nologin
polkitd:x:::User for polkitd:/:/sbin/nologin
apache:x:::Apache:/usr/share/httpd:/sbin/nologin
rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
mysql:x::::/home/mysql:/bin/bash

awk命令


awk是一个数据处理工具。可以编程,处理能力更为强大。

awk处理方式:awk一次处理一行内容,也是行处理方式,和sed命令不同,awk可以对每行切片处理,比如说可以对每行的第一个单词输出,如果用sed处理那么就要用到替换功能,比较麻烦。

awk格式:

   命令行格式:

awk [options]  'command' file(s)

脚本格式:

awk -f awk-script-file file(s)

格式:

基本格式:

command:pattern { awk操作命令(这里可以编程,awk也有内置函数) } ;         pattern :正则表达式;逻辑判断式;

扩展格式:

awk内置参数:

$0:表示整个当前行。

$1:每行第一个字段。

$2:每行第二的字段。 其它的以此类推。

分隔符:options:-F field-separator (默认为空格)。 例如: awk -F ‘:’ '{print $3}' /etc/passwd   就会把每行用:分割,然后取出第三个被分割后的字段。

NR(行):每行的记录号。

NF(列):字段数量变量。

FILENAME:正在处理的文件名。

示例1:

打印第一列和第三列

[root@localhost python]#  awk -F  ':' '{print $1,$3}' /etc/passwd     $1和$3直接的逗号,是用来显示出来的时候两列之间会有空格,起分割的作用,逗号也可以用双引号代替" "
root
bin
daemon

可以每列加上说明参数,制表的表示显示出来。

[root@localhost python]#  awk -F  ':' '{print  "user:"$1"\t ""uid:"$3}' /etc/passwd
user:root uid:
user:bin uid:
user:daemon uid:
user:adm uid:

打印出每行行号和列数

[root@localhost python]#  awk -F  ':' '{print  NR,NF}' /etc/passwd
7 前面数字表示当前的行号,后面代表当前行有多少列

也可以使用printf()函数 这个函数和php里printf()函数差不多,可以输出格式化的字符串。

[root@localhost ~]# awk -F  ':' '{printf("Line:%s Col:%s\n",NR,NF)}' /etc/passwd
Line: Col:
Line: Col:
Line: Col:
Line: Col:
Line: Col:
Line: Col:
Line: Col:
Line: Col:
Line: Col:

awk条件判断:

awk内置可以条件判断语句,比如显示passwd文件中用户ID大于100的行号和用户。

[root@localhost ~]# awk -F  ':' '{if ($3 > 100) print "Line :" NR,"USER:" $1 }' /etc/passwd
Line : USER:avahi-autoipd
Line : USER:polkitd
Line : USER:abrt
Line : USER:unbound
Line : USER:usbmuxd
Line : USER:colord
Line : USER:saslauth
Line : USER:libstoragemgmt
Line : USER:rtkit

awk逻辑判断式:

~   ,    ! ~ (波浪线取反)  :代表匹配正则表达式  , 不匹配正则表达式

  == ,   != , <  , >         : 判断逻辑表达式

示例:

匹配第一列以m开头的行

[root@localhost ~]# awk -F ':' '$1~/^m.*/{print $1}' /etc/passwd
mail
mysql

匹配第一列不是以m开头的行

[root@localhost ~]# awk -F ':' '$1!~/^m.*/{print $1}' /etc/passwd
root
bin
daemon
adm

用户ID大于200的行号和用户

[root@localhost ~]# awk -F ':' '$3>200{print $1 $3}' /etc/passwd
polkitd999
unbound998
colord997
saslauth996
libstoragemgmt995

awk扩展格式BEGIN和END:

  BEGIN {print  "start" } pattern { commands } END { print "end" }

上面命令行的意思是在awk读取行之前先执行BEGAIN 模块中的内容,然后在执行commands (这里可以循环操作)内容,最后在执行END 模块中内容。

下面看几个案例就容易懂了。

案例:

制表显示/etc/passwd文件每行的行号,每行的列数,对应行的用户名。

[root@localhost ~]# awk -F ':' 'BEGIN{print "Line  Col User "}{print NR,NF,$1}END{print "-----over-----"}' /etc/passwd
Line Col User
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
-----over-----

awk逻辑处理:

案例:

 求出目录中所有文件大小总和并打印出来

[root@localhost rabbitmq-c]# ll | awk 'BEHIN{size=0}{size+=$5}END{print "size is " size/1024/1024"M"}'  在begin时候初始化size变量为0
size is 1.61688M

统计/etc/passwd账号总人数

[root@localhost rabbitmq-c]# awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count = "count}' /etc/passwd    求文件行数但是不包括空行
count =

统计用户id大于100的用户

[root@localhost rabbitmq-c]# awk -F ':' 'BEGIN{num=0}{if ($3 > 100) name[num++]=$1}END{for (i=0;i<num;i++) print i,name[i]}' /etc/passwd   这里用到了数组 for循环
avahi-autoipd
polkitd
abrt
unbound
usbmuxd
colord
saslauth

统计网络中conneted和listen状态的数量

[root@localhost rabbitmq-c]# netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'
LISTEN
CONNECTED

【Linux】linux中文本操作利器grep,awk,sed的更多相关文章

  1. linux下的文本操作之 文本查找——grep

    摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...

  2. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  3. Linux 文本处理工具grep,sed,awk

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...

  4. Linux Bash文本操作之grep篇

    Linux grep命令用于查找文件里符合条件的字符串.是文本检索中常用的工具之一. grep  指令在文件中查找能够匹配指定模式字符串的行.如果没有指定文件名,或者文件名为  -  ,则从标准输入设 ...

  5. Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)

    1.首先我们需要先做好前期准备工作,需要到XManager6官网上将Xshell及Xftp下载并安装,安装过程一直下一步就好了.这里是其官网:http://www.xshellcn.com/.安装完成 ...

  6. LINUX系统下的shell命令---grep、sed、awk

    1)grep文本过滤命令 1.grep基本认识 (Global  search  regular expression and  print  out the  line全局搜索研究正则表达时并显示出 ...

  7. linux相关&lpar;find&sol;grep&sol;awk&sol;sed&sol;rpm&rpar;

    如何查找特定的文件: find :在指定目录下查找文件 find -name "filename" :从当前目录查找文件 find / -name "filename&q ...

  8. Linux三剑客-grep &vert;&vert; awk &vert;&vert; sed

    grep是一个强大的文本搜索工具 命令格式: grep [option] pattren file -a  将二进制文档以文本方式处理 -c  计算找到的符合行的次数 -i  忽略大小写 -n  顺便 ...

  9. linux的文件处理&lpar;匹配 正则表达式 egrep awk sed&rpar;和系统、核心数据备份

    文件处理 1.处理方式 匹配 正则表达式 egrep awk sed 2.文件中的处理字符 \n  新行符 换行 \t  制表符 tab键 缺省8个空格 \b  退格符 backspace键 退格键 ...

随机推荐

  1. Java的常用对象①②

    Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...

  2. mysql基础面试

    php面试题之五--MySQL数据库(基础部分) 五.MySQL数据库 mysql_num_rows() mysql_affected_rows() 这两个函数都作用于 mysql_query($qu ...

  3. Leetcode 83 Remove Duplicates from Sorted List 链表

    就是将链表中的重复元素去除 我的方法很简单就是如果链表的前后元素相同的话,将后一个元素删除 /** * Definition for singly-linked list. * struct List ...

  4. Libsvm:脚本(subset&period;py、grid&period;py、checkdata&period;py) &vert; MATLAB&sol;OCTAVE interface &vert; Python interface

    1.脚本 This directory includes some useful codes: 1. subset selection tools. (子集抽取工具) subset.py 2. par ...

  5. C&num;Linq的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. hdu4756 Install Air Conditioning&lpar;MST &plus; 树形DP&rpar;

    题目请戳这里 题目大意:给n个点,现在要使这n个点连通,并且要求代价最小.现在有2个点之间不能直接连通(除了第一个点),求最小代价. 题目分析:跟这题一样样的,唉,又是原题..先求mst,然后枚举边, ...

  7. hdu1166 经典线段入门

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. Delphi使用大图标编译程序

    在Windows Vista. Windows7以上Windows系统中可以支持大图标显示了,但是Delphi编译出来的程序却只能显示32x32的图标,这使Delphi编译的程序看起来很不专业.下面就 ...

  9. iOS技术框架构和更新版本的技术特性

    Core OS层 Sytem 系统层包括内核环境,驱动及操作系统层unix接口.内核以mach为基础,它 负责操作系统的各个方面,包括管理系统的虚拟内存,线程,文件系统,网络以及进程间通讯.这一层包含 ...

  10. 【WPF】三维模型中的&OpenCurlyDoubleQuote;照相机”

    WPF 部分支持三维模型,为啥说是部分支持?毕竟 WPF 的侧重点还是在应用开发上,虽然也有些游戏是用 WPF 开发的,不过,老周想啊,如果真要开发游戏,最好用专门的框架,WPF 应当用于开发应用功能 ...