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相关(find/grep/awk/sed/rpm)

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

  8. Linux三剑客-grep || awk || sed

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

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

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

随机推荐

  1. Windows10 Build 18298 桌面显示计算机(此电脑)

  2. Redis 安装学习

    Linux下下载安装redis https://redis.io/download tar -zvxf redisxxx cd redisxxxx make  ---进行安装 vim ~.bash_p ...

  3. Angular ngRepea

    <!DOCTYPE html><html ng-app><head lang="en"> <meta charset="UTF- ...

  4. Day3-1 函数

    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法: def calc(x, y): ...

  5. 如何使用nodejs快速搭建本地服务器

    1.首先要安装好node,js 2.以下有安装包下载的链接:这里的安装包是.msi,如果要其他的,可以到菜鸟教程上去找 32 位安装包下载地址 : https://nodejs.org/dist/v4 ...

  6. python爬虫之git的安装

      一.初始 1.发展历史 *最开始没有对代码的管理,导致很多东西混乱和丢失. *后来大家想了一个办法,用最简单最笨的方法,各种复制文件夹. *然后就出现了版本控制的工具. 1.单机版:RCS(198 ...

  7. PhpStorm本地断点调试

    一.断点调试php环境搭建 1.检测本地php环境是否安装了Xdebug 在本地输出phpinfo():搜索Xdebug;如下图  如果没有安装,安装操作Xdebug如下: 将phpinfo();的信 ...

  8. 莫烦scikit-learn学习自修第四天【内置训练数据集】

    1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from sklearn import datasets from sklearn.linea ...

  9. easyui combobox 在datagrid中动态加载数据

    场景:datagrid 中用编辑框修改数据,有一个列使用的combobox  在可编辑的时候需要动态绑定数据,这个数据是在根据其他条件可变的 思路:在每次开启编辑框的时候动态绑定数据, datagri ...

  10. Python——列表操作

    一.列表中所有元素出现的次数,并输出为字典模式 def count_list(list): b_list = {} for i in set(list): b_list[i] = list.count ...