Linux文本处理命令grep

1. 查找单个关键字

举例:查找Baiduspider访问日志,并输出行号。

# grep -n Baiduspider /usr/local/nginx1.14/logs/access.log

3371:180.76.15.137 - - [31/Dec/2018:05:05:46 +0800] "GET /asset/detail/show/RG9ja2VyIENFIDE4LjA5IOS9v+eUqERvY2tlcmZpbGXlronoo4 HTTP/1.1" 200 4748 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
4570:180.76.15.11 - - [08/Jan/2019:16:57:04 +0800] "GET /asset/detail/show/RG9ja2VyIENFIDE4LjA5IOS9v+eUqERvY2tlcmZpbGXlronoo4 HTTP/1.1" 200 7754 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
4693:180.76.15.20 - - [09/Jan/2019:05:29:54 +0800] "GET /asset/detail/show/Q2VudE9TNy41IE15U1FMOC4wLjEzIFJQTea6kOeggee8luivke HTTP/1.1" 200 16691 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
4924:180.76.15.160 - - [10/Jan/2019:22:30:28 +0800] "GET /asset/detail/show/SlF1ZXJ5My4zLjEg6YCJ5oup5Zmo HTTP/1.1" 200 10049 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
...

2. 查找多个关键字

举例:查找Baiduspider、bingbot、Googlebot访问日志,并输出行号。

# grep -n -E 'Baiduspider|bingbot|Googlebot' /usr/local/nginx1.14/logs/access.log

5620:203.208.60.0 - - [14/Jan/2019:10:26:09 +0800] "GET / HTTP/1.1" 200 17232 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
5639:180.76.15.21 - - [14/Jan/2019:16:39:35 +0800] "GET / HTTP/1.1" 200 17232 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
5888:157.55.39.40 - - [17/Jan/2019:13:45:05 +0800] "GET / HTTP/1.1" 200 17232 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
...

3. 多文件查找关键字

举例:查找10.100.78.12服务器多天的监控日志。

# grep 10.100.78.12 2018-12-10.bjyz.network.monitor.log 2018-12-11.bjyz.network.monitor.log

2018-12-10.bjyz.network.monitor.log:[2018-12-10]|[13:10:00]|10.100.78.12|active
2018-12-11.bjyz.network.monitor.log:[2018-12-11]|[13:10:00]|10.100.78.12|down

4. 递归查找关键字

举例:递归查找10.100.78.12服务器多天的监控日志。

grep -r 10.100.78.12

2018-12-10.bjyz.network.monitor.log:[2018-12-10]|[13:10:00]|10.100.78.12|active
2018-12-11.bjyz.network.monitor.log:[2018-12-11]|[13:10:00]|10.100.78.12|down
2018-12-12.bjyz.network.monitor.log:[2018-12-12]|[13:10:00]|10.100.78.12|active

5. 查找指定进程

举例:查找java进程。

# ps -ef | grep java

6. 查找进程个数

举例:查找java进程个数。

# ps -ef | grep -c java

Linux命令之grep/sed/awk等行转列

行转列

样例文件如下

cat file.txt
a b c
d e f
g h i

1、cat file.txt |xargs -n1

2、xargs -n 1 < file.txt

3、tr " " "n" < file.txt

4、sed 's/ /n/g' file.txt
此命令在Linux上执行正常,在Mac上执行无效,原因是因为Mac上的sed是BSD版本,Linux上的是Gnu版本,在Mac上需要使用sed -e ‘s/ /’$’n/g’ file.txt

5、sed 's/ /n/g' file.txt 同上

6、awk '{for(i=1;i<=NF;i++)print $i}' file.txt

7、awk -vOFS="n" '$1=$1' file.txt Linux上正常,Mac上无效

8、awk '{OFS=RS}NF=NF' file.txt Linux上正常,Mac上无效

列转行

样例文件如下

cat file.txt
a
b
c
d
e
f

1、cat file.txt | tr "n" ","

Linux三大利器grep、sed、awk

一. grep和正则表达式

grep

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

选项

-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。

-i 忽略字符大小写的差别。

-l 列出文件内容符合指定的范本样式的文件名称。

-n 在显示符合范本样式的那一列之前,标示出该列的编号。

-R/-r 此参数的效果和指定“-d recurse”参数相同。

-v 反转查找。

1、-r递归查找

root@siguorui-OptiPlex-7010:/home/xhprof/trunk# grep -r XHProfRuns_Default *
examples/sample.php:$xhprof_runs = new XHProfRuns_Default();
xhprof_html/callgraph.php:$xhprof_runs_impl = new XHProfRuns_Default();
xhprof_html/typeahead.php:$xhprof_runs_impl = new XHProfRuns_Default();

2、-I的使用,显示文件名称

root@siguorui-OptiPlex-7010:~# grep -I root abc.txt 123.txt passwd 
passwd:root:x:0:0:root:/root:/bin/bash

3、-n

root@siguorui-OptiPlex-7010:~# grep -n 'root' passwd 
1:root:x:0:0:root:/root:/bin/bash

正则表达式

1、正则表达式单字符

  • 特定字符
    • grep ‘a’ passwd
  • 范围内字符
    • grep ‘[a-z]’ passwd
    • grep ‘[A-Za-z0-9]’ passwd
    • grep ‘[^0-9]’ passwd 取反,除去数字之外的字符
  • 任意字符
    • grep ‘.’ passwd

但是在grep ‘[.]’中,.只是代表点这样的字符,注意区别。如果要使用.的本意,采用.的方式

  • 以上三种组合

2、正则表达式其他符号

  • 边界字符 头尾字符
    • ^字符,头字符,放在一串字母前边,代表以此开头。grep ‘^root’ passwd
    • $符号,如false$,代表以false字符结束
    • ^$ 代表空行,grep ‘^$’ passwd
  • 元字符
    • w:匹配任何字类字符,包括下划线。相当于([A-Za-z0-9_])
    • W:大写的W,匹配任何非字类字符。相当于([^A-Za-z0-9_])
    • b 代表单词分隔。如,grep ‘bxb’ passwd,可以将单个前后分隔的x字符选出来,但不会选择单词中出现的x
  • 正则表达式字符组合
    • 重复
* : 零次或多次匹配前面的字符或子表达式。例子:grep 'se*' test.txt
+ : 一次或多次匹配前面的字符或表达式.例子:grep 'se+' test.txt.注意这里加号前面要加反斜杠
? : 零次或一次匹配前面的字符或表达式.如:grep 'se?' test.txt.注意?前面也要加反斜杠
括号的使用 :grep '(se)*' test.txt。注意括号前面要加反斜杠
指定重复次数 : grep '[0-9]{2,3}' passwd 

二.sed 行编辑器

sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

命令格式

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

options常用选项

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

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

command常用

a 在当前行下面插入文本。
i 在当前行上面插入文本。
c 把选定的行改为新的文本。
d 删除,删除选择的行。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
s 替换指定字符
p 打印模板块的行。
q 退出Sed。
r file 从file中读行。
w file 写并追加模板块到file末尾。  

1、p 打印相关的行

nl passwd|sed -n '10p' //打印第10行内容
sed -n 'p' passwd
sed -n '/root/p' passwd //正则匹配打印
nl passwd|sed -n '10,20p' //打印第10行到20行
nl passwd|sed -n '/news/,/nobody/p' //用正则来指定一个行的范围
nl passwd|sed -n '10,20!p'  //不选择10到20行,!代表取反
nl passwd|sed -n '1~2p' //间隔行,会输出1,3,5....行

注意,这里一定要加上-n选项,否则每条数据会显示同样的2行。并且无关的其他内容也会显示出来

2、a 在行后面增加内容

root@siguorui-OptiPlex-7010:~# nl passwd|sed '2a **************'
     1    root:x:0:0:root:/root:/bin/bash
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
**************
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin

nl passwd|sed '1,2a **************' //在范围内的每一行后面都插入

3、i在行前面插入

root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,2i **************'
**************
     1    root:x:0:0:root:/root:/bin/bash
**************
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

4、c把选定的行改为新的文本

root@siguorui-OptiPlex-7010:~# nl passwd|sed '1c abcd'
abcd
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

 //与a,i不同的时,如果这里是一个行的范围则是把这个范围内容替换为当前内容   
root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,3c abcd'
abcd
     4    sys:x:3:3:sys:/dev:/usr/sbin/nologin

5、d删除行

root@siguorui-OptiPlex-7010:~# nl passwd | sed '/root/d'
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin

应用案例

在文件的末尾插入2行
nl passwd | sed '$a     abcd n    linux'

    49    memcache:x:126:132:Memcached,,,:/nonexistent:/bin/false
    50    postfix:x:127:133::/var/spool/postfix:/bin/false
    51    mongodb:x:128:65534::/var/lib/mongodb:/bin/false
    abcd 
    linux


    删除文件中的空行,^$直接相连代表空行
    nl passwd | sed '/^$/d'

6、s替换命令

sed 's/false/true/' passwd 
输出:
...
sphinxsearch:x:124:131::/home/sphinxsearch:/bin/true
sshd:x:125:65534::/var/run/sshd:/usr/sbin/nologin
memcache:x:126:132:Memcached,,,:/nonexistent:/bin/true
postfix:x:127:133::/var/spool/postfix:/bin/true

sed 's/:/%/g' passwd  //加g全局替换
输出:
sphinxsearch%x%124%131%%/home/sphinxsearch%/bin/false
sshd%x%125%65534%%/var/run/sshd%/usr/sbin/nologin
memcache%x%126%132%Memcached,,,%/nonexistent%/bin/false
postfix%x%127%133%%/var/spool/postfix%/bin/false

过滤ifconfig中的ip

eno1      Link encap:以太网  硬件地址 f8:b1:56:c5:e7:44  
          inet 地址:172.19.5.175  广播:172.19.5.255  掩码:255.255.255.0
          inet6 地址: fe80::c422:e82d:ad66:7a92/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:35171885 错误:53864 丢弃:0 过载:0 帧数:29047
          发送数据包:25049325 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:8124495140 (8.1 GB)  发送字节:4549284803 (4.5 GB)
          中断:20 Memory:f7f00000-f7f20000 

 ifconfig eno1 | sed -n '/inet /p'|sed 's/inet.*地址://'|sed 's/广播.*$//'

 输出:
 172.19.5.175

高级操作命令

1、多个sed命令,用{}包住,‘;’隔开

删除44-48行内容,然后将false替换为true
nl passwd|sed '{44,48d;s/false/true/}'

    41    statd:x:121:65534::/var/lib/nfs:/bin/true
    42    mysql:x:1001:1001::/home/mysql:/sbin/nologin
    43    www:x:1002:1002::/home/www:/sbin/nologin
    49    memcache:x:126:132:Memcached,,,:/nonexistent:/bin/true
    50    postfix:x:127:133::/var/spool/postfix:/bin/true
    51    mongodb:x:128:65534::/var/lib/mongodb:/bin/true

2、n 读取下一个输入行

//n的用法
root@siguorui-OptiPlex-7010:~# nl passwd|sed -n '{p;n}'
     1    root:x:0:0:root:/root:/bin/bash
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin
     5    sync:x:4:65534:sync:/bin:/bin/sync
     7    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

提示: nl passwd|sed -n '{1~2p}'  前面讲到的,~也可以实现同样的效果

3、&替换固定字符串,&代表前面匹配到的字符

//姓名和后面的内容加空格隔开
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/&     /' passwd
root     :x:0:0:root:/root:/bin/bash
daemon     :x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin     :x:2:2:bin:/bin:/usr/sbin/nologin


//用户名的首字母转换为大写
//元字符u l(对首字母大小写转换) U L(对一串字符大小写转换),转换为大写小写字符

//小写u,替换用户名首字母
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/u&/' passwd
Root:x:0:0:root:/root:/bin/bash
Daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Bin:x:2:2:bin:/bin:/usr/sbin/nologin

//大写U,用户名全部替换为大写
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/U&/' passwd
ROOT:x:0:0:root:/root:/bin/bash
DAEMON:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
BIN:x:2:2:bin:/bin:/usr/sbin/nologin

4、()的使用

//从passwd文件中,提取出username,uid,gid.  1,2,3代表前面()匹配到字符
root@siguorui-OptiPlex-7010:~# sed 's/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/USER:1    UID:2   GID:3/' passwd
USER:root    UID:0   GID:0
USER:daemon    UID:1   GID:1
USER:bin    UID:2   GID:2
USER:sys    UID:3   GID:3
USER:sync    UID:4   GID:65534

5、-r复制指定文件插入到匹配行。-w复制匹配行拷贝到指定文件

//123.txt文件中有3行,全是数字。abc.txt文件中有3行,全是字母
//下面命令的实现结果,读取123.txt的内容,复制到匹配的abc.txt文件的第一行,文件内容均不改变
root@siguorui-OptiPlex-7010:~# sed '1r 123.txt' abc.txt 
qwefadssa
1232323223
32343434
23333
trwrda
asdfasdf

//下面命令的实现结果,匹配abc.txt文件的第二行,写入到123.txt文件中。123.txt文件会发生变化,abc.txt文件内容不变
root@siguorui-OptiPlex-7010:~# sed '2w 123.txt' abc.txt 
qwefadssa
trwrda
asdfasdf
root@siguorui-OptiPlex-7010:~# cat 123.txt 
trwrda


//总结
sed '2w或2r 文件A' 文件B
匹配的文件都是针对文件B来说的,读或写都是针对文件A来说的

6、q找到指定结果后就提前退出

root@siguorui-OptiPlex-7010:~# nl passwd |sed '2q'
     1    root:x:0:0:root:/root:/bin/bash
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
root@siguorui-OptiPlex-7010:~# nl passwd |sed '/root/q'
     1    root:x:0:0:root:/root:/bin/bash
root@siguorui-OptiPlex-7010:~# 

三、awk

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。特点是处理灵活,功能强大。可实现统计、制表以及其他功能。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

格式

命令行格式
awk [options] 'command' file(s)

脚本格式
awk -f awk-script-file file(s)

命令形式:

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
  • [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value

' ' 引用代码块

  • BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
  • // 匹配代码块,可以是字符串或正则表达式
  • {} 命令代码块,包含一条或多条命令
  • ; 多条命令使用分号分隔
  • END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

常用内置参数

  • $0,$1,$2… 表示整个当前行
  • $1 每行第一个字段
  • NF 字段数量变量
  • NR 每行的记录号,多文件记录递增
  • FILENAME 文件名

1、常用内置参数,$1,$2….。通过分隔符指定,按顺序依次为$1,$2…。默认分隔符为空格

awk -F ':' '{print "USERNAE:"$1"t""UID:"$3}' passwd

2、NR,NF,FILENAME

awk -F ':' '{print "Line:"NR,"Col:"NF,"USER:"$1}' passwd

3、运用printf指定格式来打印

awk -F ':' '{printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd

root@siguorui-OptiPlex-7010:~# awk -F ':' '{printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd
Line:  1 Col:7 User:root
Line:  2 Col:7 User:daemon
Line:  3 Col:7 User:bin
Line:  4 Col:7 User:sys
...

4、使用if

awk -F ':' '{if ($3>100) printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd

5、正则和命令结合使用

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

root@siguorui-OptiPlex-7010:~# awk -F ':' '/root/{print $1}' passwd
root

6、使用BEGIN和END来制表

awk -F ':' 'BEGIN{print "line col user"}{print NR" |"NF" |"$1}END{print "----------------"FILENAME}' passwd

7、使用BEGIN和END来统计一个目录下文件总计大小

ls -l|awk 'BEGIN{size=0}{size+=$5}END{print " size is "size/1024/1024"M"}'

8、统计passwd中不为空的行数。$1!~,~代表匹配后面的正则,!~代表不匹配。/^$/正则匹配空行

awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print " count ="count}' passwd

9、统计结果放到数组中,并打印输出

awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 

root@siguorui-OptiPlex-7010:~# awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 
0 nobody
1 systemd-network
2 systemd-resolve
3 systemd-bus-proxy
4 syslog

Shell中使用grep、sed正则提取、替换字符串

Linux中使用grep正则提取字符串

echo office365 | grep -P 'd+' -o
find . -name "*.txt" | xargs grep -P 'regex' -o

xargs会将find结果作为grep的输入,防止find结果过多无法处理
-P参数表明要应用正则表达式
-o表示只输出匹配的字符串,这样我们就可以把正则匹配到的结果拿到了。

Linux、Mac OS中使用sed正则提取字符串

Mac OS上用正则的话要用e参数取代P参数,也可以用sed命令:
sed命令格式:

sed 's/oldValue/newValue/g'

提取字符串

echo here365test | sed 's/.*ere([0-9]*).*/1/g'

输出:

365

s表示替换,1表示用第一个括号里面的内容替换整个字符串,sed支持*,不支持?、+,不能用d之类,正则支持有限。

替换字符串

echo here365test | sed 's/365/789/g'

输出:

here789test

linux下的find文件查找命令与grep文件内容查找命令

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。

区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。

(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。

一、find命令

基本格式:find  path expression

1. 按照文件名查找

(1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找

(2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf

(3) find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件

(4) find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

2. 按照文件特征查找

(1) find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)

(2) find / -atime -2   # 查找在系统中最后48小时访问的文件

(3) find / -empty   # 查找在系统中为空的文件或者文件夹

(4) find / -group cat   # 查找在系统中属于 group为cat的文件

(5) find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)

(6) find / -mtime -1   #查找在系统中最后24小时里修改过的文件

(7) find / -user fred   #查找在系统中属于fred这个用户的文件

(8) find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)

(9) find / -size -1000k   #查找出小于1000KB的文件

3. 使用混合查找方式查找文件

参数有: !,-and(-a),-or(-o)。

(1) find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件

(2) find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件

(3) find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件`

二、grep命令

基本格式:find  expression

1. 主要参数

[options]主要参数:

  • -c:只输出匹配行的计数。

  • -i:不区分大小写

  • -h:查询多文件时不显示文件名。

  • -l:查询多文件时只输出包含匹配字符的文件名。

  • -n:显示匹配行及行号。

  • -s:不显示不存在或无匹配文本的错误信息。

  • -v:显示不包含匹配文本的所有行。

pattern正则表达式主要参数:

  • : 忽略正则表达式中特殊字符的原有含义。

  • ^:匹配正则表达式的开始行。

  • $: 匹配正则表达式的结束行。

  • <:从匹配正则表达 式的行开始。

  • >:到匹配正则表达式的行结束。

  • [ ]:单个字符,如[A]即A符合要求 。

  • [ – ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

  • .:所有的单个字符。

  • * :有字符,长度可以为0。

2. 实例

(1) grep 'test' d*  #显示所有以d开头的文件中包含 test的行

(2) grep ‘test’ aa bb cc    #显示在aa,bb,cc文件中包含test的行

(3) grep ‘[a-z]{5}’ aa   #显示所有包含每行字符串至少有5个连续小写字符的字符串的行

(4) grep magic /usr/src  #显示/usr/src目录下的文件(不含子目录)包含magic的行

(5) grep -r magic /usr/src  #显示/usr/src目录下的文件(包含子目录)包含magic的行

(6) grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)

使用 grep 查找所有包含指定文本的文件

目标:本文提供一些关于如何搜索出指定目录或整个文件系统中那些包含指定单词或字符串的文件。

难度:容易

约定:

# – 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行也可以使用 sudo 命令
$ – 可以使用普通用户来执行指定命令

案例

非递归搜索包含指定字符串的文件

第一个例子让我们来搜索 /etc/ 目录下所有包含 stretch 字符串的文件,但不去搜索其中的子目录:

# grep -s stretch /etc/*
/etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-release:VERSION="9 (stretch)"

grep 的 -s 选项会在发现不存在或者不能读取的文件时隐藏报错信息。结果显示除了文件名之外,还有包含请求字符串的行也被一起输出了。

递归地搜索包含指定字符串的文件

上面案例中忽略了所有的子目录。所谓递归搜索就是指同时搜索所有的子目录。

下面的命令会在 /etc/ 及其子目录中搜索包含 stretch 字符串的文件:

# grep -R stretch /etc/*
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main
/etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main
/etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main
/etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main
/etc/dictionaries-common/words:backstretch
/etc/dictionaries-common/words:backstretch's
/etc/dictionaries-common/words:backstretches
/etc/dictionaries-common/words:homestretch
/etc/dictionaries-common/words:homestretch's
/etc/dictionaries-common/words:homestretches
/etc/dictionaries-common/words:outstretch
/etc/dictionaries-common/words:outstretched
/etc/dictionaries-common/words:outstretches
/etc/dictionaries-common/words:outstretching
/etc/dictionaries-common/words:stretch
/etc/dictionaries-common/words:stretch's
/etc/dictionaries-common/words:stretched
/etc/dictionaries-common/words:stretcher
/etc/dictionaries-common/words:stretcher's
/etc/dictionaries-common/words:stretchers
/etc/dictionaries-common/words:stretches
/etc/dictionaries-common/words:stretchier
/etc/dictionaries-common/words:stretchiest
/etc/dictionaries-common/words:stretching
/etc/dictionaries-common/words:stretchy
/etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
/etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-release:VERSION="9 (stretch)"

搜索所有包含特定单词的文件

上面 grep 命令的案例中列出的是所有包含字符串 stretch 的文件。也就是说包含 stretches , stretched 等内容的行也会被显示。 使用 grep 的 -w 选项会只显示包含特定单词的行:

# grep -Rw stretch /etc/*
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main
/etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main
/etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main
/etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main
/etc/dictionaries-common/words:stretch
/etc/dictionaries-common/words:stretch's
/etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
/etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-release:VERSION="9 (stretch)"

显示包含特定文本的文件名

上面的命令都会产生多余的输出。下一个案例则会递归地搜索 etc 目录中包含 stretch 的文件并只输出文件名:

# grep -Rl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
/etc/grub.d/00_header
/etc/os-release

大小写不敏感的搜索

默认情况下搜索是大小写敏感的,也就是说当搜索字符串 stretch 时只会包含大小写一致内容的文件。

通过使用 grep 的 -i 选项,grep 命令还会列出所有包含 Stretch , STRETCH , StReTcH 等内容的文件,也就是说进行的是大小写不敏感的搜索。

# grep -Ril stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/default.hash
/etc/dictionaries-common/words
/etc/grub.d/00_header
/etc/os-release

搜索时包含/排除指定文件

grep 命令也可以只在指定文件中进行搜索。比如,我们可以只在配置文件(扩展名为.conf)中搜索指定的文本/字符串。 下面这个例子就会在 /etc 目录中搜索带字符串 bash 且所有扩展名为 .conf 的文件:

# grep -Ril bash /etc/*.conf
OR
# grep -Ril --include=*.conf bash /etc/*
/etc/adduser.conf

类似的,也可以使用 –exclude 来排除特定的文件:

# grep -Ril --exclude=*.conf bash /etc/*
/etc/alternatives/view
/etc/alternatives/vim
/etc/alternatives/vi
/etc/alternatives/vimdiff
/etc/alternatives/rvim
/etc/alternatives/ex
/etc/alternatives/rview
/etc/bash.bashrc
/etc/bash_completion.d/grub
/etc/cron.daily/apt-compat
/etc/cron.daily/exim4-base
/etc/dictionaries-common/default.hash
/etc/dictionaries-common/words
/etc/inputrc
/etc/passwd
/etc/passwd-
/etc/profile
/etc/shells
/etc/skel/.profile
/etc/skel/.bashrc
/etc/skel/.bash_logout

搜索时排除指定目录

跟文件一样,grep 也能在搜索时排除指定目录。 使用 –exclude-dir 选项就行。

下面这个例子会搜索 /etc 目录中搜有包含字符串 stretch 的文件,但不包括 /etc/grub.d 目录下的文件:

# grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
/etc/os-release

显示包含搜索字符串的行号

-n 选项还会显示指定字符串所在行的行号:

# grep -Rni bash /etc/*.conf
/etc/adduser.conf:6:DSHELL=/bin/bash

寻找不包含指定字符串的文件

最后这个例子使用 -v 来列出所有不包含指定字符串的文件。

例如下面命令会搜索 /etc 目录中不包含 stretch 的所有文件:

# grep -Rlv stretch /etc/*

Linux下grep显示前后几行信息

摘要: 标准unix/linux下的grep通过下面參数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行grep -B 5 foo file 显示foo及前5行grep -A 5 foo file 显示foo及后5行 查看grep版本号的方法是grep -V 假设想升级,升级的方法:最新的源代码(google或者百度搜索主页),编译安装到某个地方,比方 /home/aaa/bin/ 那么以后用的时候就用 /home/aaa/bin/grep ,或者把 /home/aaa/bin 加到PATH环境变量就可以。

标准unix/linux下的grep通过下面參数控制上下文

grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行

grep -B 5 foo file 显示foo及前5行

grep -A 5 foo file 显示foo及后5行

查看grep版本号的方法是

grep -V

假设想升级,升级的方法:最新的源代码(google或者百度搜索主页),编译安装到某个地方,比方 /home/aaa/bin/ 那么以后用的时候就用 /home/aaa/bin/grep ,或者把 /home/aaa/bin 加到PATH环境变量就可以。 假设你把最新编译好的grep覆盖到你如今grep所在文件夹,则升级自然就完成了。

grep命令实例详解——全局正则表达式输出神器

概述

所有的类linux系统都会提供一个名为grep(global regular expression print,全局正则表达式输出)的搜索工具。grep命令在对一个或多个文件的内容进行基于模式的搜索的情况下是非常有用的。模式可以是单个字符、多个字符、单个单词、或者是一个句子。

当命令匹配到执行命令时指定的模式时,grep会将包含模式的一行输出,但是并不对原文件内容进行修改。

在本文中,我们将会讨论到grep命令实例详解。

实例详解

例1 在文件中查找模式(单词)

在/etc/passwd文件中查找单词linuxtechi

root@Linux-world:~# grep linuxtechi /etc/passwd
linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash
root@Linux-world:~#

例2 在多个文件中查找模式

root@Linux-world:~# grep linuxtechi /etc/passwd /etc/shadow /etc/gshadow
/etc/passwd:linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash
/etc/shadow:linuxtechi:$6$DdgXjxlM$4flz4JRvefvKp0DG6re:16550:0:99999:7:::/etc/gshadow:adm:*::syslog,linuxtechi
/etc/gshadow:cdrom:*::linuxtechi
/etc/gshadow:sudo:*::linuxtechi
/etc/gshadow:dip:*::linuxtechi
/etc/gshadow:plugdev:*::linuxtechi
/etc/gshadow:lpadmin:!::linuxtechi
/etc/gshadow:linuxtechi:!::
/etc/gshadow:sambashare:!::linuxtechi

例3 使用-l参数列出包含指定模式的文件的文件名

root@Linux-world:~# grep -l linuxtechi /etc/passwd /etc/shadow /etc/fstab /etc/mtab
/etc/passwd
/etc/shadow

例4 使用-n参数,在文件中查找指定模式并显示匹配行的行号

root@Linux-world:~# grep -n linuxtechi /etc/passwd
39:linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash

例5 使用-v参数输出不包含指定模式的行

输出/etc/passwd文件中所有不含单词“linuxtechi”的行

root@Linux-world:~# grep -v linuxtechi /etc/passwd

例6 使用^符号输出所有以某指定模式开头的行

Bash脚本将^符号视作特殊字符,用于指定一行或者一个单词的开始。例如输出/etc/passwd文件中所有以“root”开头的行

root@Linux-world:~# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

例7 使用$符号输出所有以指定模式结尾的行

输出/etc/passwd文件中所有以bash结尾的行

root@Linux-world:~# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash

Bash脚本将美元$符号视作特殊字符,用于指定一行或者一个单词的结尾。

例8 使用-r参数递归地查找特定模式

root@Linux-world:~# grep -r linuxtechi /etc/
/etc/subuid:linuxtechi:100000:65536
/etc/group:adm:x:4:syslog,linuxtechi
/etc/group:cdrom:x:24:linuxtechi
/etc/group:sudo:x:27:linuxtechi
/etc/group:dip:x:30:linuxtechi
/etc/group:plugdev:x:46:linuxtechi
/etc/group:lpadmin:x:115:linuxtechi
/etc/group:linuxtechi:x:1000:
/etc/group:sambashare:x:131:linuxtechi
/etc/passwd-:linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash
/etc/passwd:linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash
............................................................................

上面的命令将会递归的在/etc目录中查找linuxtechi单词

例9 使用grep查找文件中所有的空行

root@Linux-world:~# grep ^$ /etc/shadow

由于/etc/shadow文件中没有空行,所以没有任何输出

例10 使用-i参数查找模式

grep命令的-i参数在查找时忽略字符的大小写。

我们来看一个例子,在passwd文件中查找LinuxTechi单词。

nextstep4it@localhost:~$ grep -i LinuxTechi /etc/passwd
linuxtechi:x:1001:1001::/home/linuxtechi:/bin/bash
nextstep4it@localhost:~$

例11 使用-e参数查找多个模式

例如,我想在一条grep命令中查找linuxtechi和root单词,使用-e参数,我们可以查找多个模式。

root@Linux-world:~# grep -e "linuxtechi" -e "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash

例12 使用-f用文件指定待查找的模式

首先,在当前目录中创建一个搜索模式文件grep_pattern,我想文件中输入的如下内容。

root@Linux-world:~# cat grep_pattern
^linuxtechi
root
false$

现在,试试使用grep_pattern文件进行搜索

root@Linux-world:~# grep -f grep_pattern /etc/passwd

未分类

例13 使用-c参数计算模式匹配到的数量

继续上面例子,我们在grep命令中使用-c命令计算匹配指定模式的数量

root@Linux-world:~# grep -c -f grep_pattern /etc/passwd
22

例14 输出匹配指定模式行的前或者后面N行

  • 使用-B参数输出匹配行的前4行
root@Linux-world:~# grep -B 4 "games" /etc/passwd

未分类

  • 使用-A参数输出匹配行的后4行
root@Linux-world:~# grep -A 4 "games" /etc/passwd

未分类

  • 使用-C参数输出匹配行的前后各4行
root@Linux-world:~# grep -C 4 "games" /etc/passwd

未分类

例15 grep搜索目录时,排除某些目录

使用grep搜索目录时,会将一些隐藏目录也给搜进去,比如.git目录,如何在使用grep时排除这些目录

使用 –exclude-dir 选项。

语法

--exclude-dir=DIR
Exclude directories matching the pattern DIR from recursive searches.
  • 单个目录示例
grep -E "http"  ./ -R --exclude-dir=.git
  • 多个目录示例
grep -E "http"  . -R --exclude-dir={.git,res,bin}
  • 多个文件示例排除扩展名为 java 和 js 的文件
grep -E "http"  . -R --exclude=*.{java,js}

例16 使用-L参数列出包含指定模式的文件的文件名

逆转输出,使用-L选项来输出那些不匹配的文件的文件名

grep -L "word" filename
grep -L root /etc/*

【Linux】cat、tail、head、grep、sed查看文件任意几行的数据

grep结果太多, 可否只取前面10行匹配的结果

grep ...... | head -10

一、使用cat、tail、head组合

1、查看最后1000行的数据

cat filename | tail -n 1000

2、查看1000到3000行的数据

cat filename | head -n 3000 | tail -n +1000

1、cat filename 打印文件所有内容
2、tail -n 1000 打印文件最后1000行的数据
3、tail -n +1000 打印文件第1000行开始以后的内容
4、head -n 1000 打印前1000的内容

二、使用sed命令

显示1000到300行的数据

sed -n '1000,3000p' filename

============================================
输入ps,它就是我们今天的主角,ps是linux操作系统中最基本同时也是非常强大的进程查看命令,如果你对此命令不是十分了解,我们可以输入ps
–help命令来查看此命令的帮助信息。
通过帮助信息我们可以看到,ps命令的相关参数有很多,很多初学的朋友可能会看的一头雾水,不知道该怎么组合这些参数,下面小编就举一些实际应用例子,来介绍一些比较常用的查看进程的固定命令组合。
我们先来看第一个命令,ps

-l命令。这个命令和直接使用ps效果类似,但是不同之处在于使用ps命令获得结果很短,而使用-l参数之后将会较长、较详细的列出该PID的的信息列出,由于参数较多,小编就不一一介绍各个参数的含义了,如果想要了解参数的具体含义可以上网查看相关信息。
接着我们来看第二个命令ps

aux,有“-”符号和没有两者是有区别的,这个命令应该是比较常用的一个命令,作用就是列出目前所有的正在内存当中的程序,其中a表示显示现行终端机下的所有程序,包括其他用户的程序,u表示以用户为主的格式来显示程序状况,x表示显示所有程序,不以终端机来区分,它的相关参数也不少,例如user,表示属于那个使用者账号的,%CPU表示使用掉的CPU资源百分比,其他的参数就不一一的介绍了,有兴趣可以自行查看。

============================================
rl+ 是什么状态 linux ?是串联和是并联。

linux三大利器–grep|sed|awk

  • grep 文本查找
  • sed 行编辑器
  • awk 文本处理工具

grep

grep 比较简单 查找文本离不开正则 具体用法如从简单到复杂如

grep '[1-9]' 文件名 //匹配含有1到9数字
grep '[^1-9]' 文件名 //匹配除了1-9数字的其他字符
grep '^root' 文件名 //^变成头字符 以root开头
grep '^$' 文件名 //头和尾加起来 匹配空行
grep '.' 文件名 //匹配.
grep 'w' 文件名 //等同([a-zA-Z1-9_])
grep 'W' 文件名 //等同([^a-zA-Z1-9_])
grep 'b' 文件名 //表示单词分隔 如 b[a]b 就是a
grep 'sb+' 文件名 //匹配至少出现一次的sb
grep 'sb*' 文件名 //有s或者b都可以
grep '.' 文件名 //匹配任意字符

sed

  • 可用自动处理文件
  • 分析日志文件
  • 修改配置文件

  • sed的处理原则是行处理,而且不改变源文件

sed的格式

sed [options] ‘command’ file(s) //命令行格式
sed 'p' passwd #会打印出两行,因为sed的原理是读入一行,输出一行,此处再加上p命令打印出来的一行,所以最后会打印出两行
sed -n 'p'passwd #加了-n选项之后,只会打印出相关的行,那些不相关的行则不会打印出来