Linux - grep命令

基本用法

grep [选项...] 范本样式 [文件...]

grep [选项...] -e 范本样式 [文件...]

grep [选项...] -f 范本文件 [文件...]

常用参数

参数 说明
-i , --ignore-case ignore-case 忽略大小写
-n, --line-number 在输出结果前加入源文件行号 帮助定位
-c, --count 统计匹配的行数
-v, --invert-match 对输出结果取反
-E, --extended-regexp 扩展正则表达式 = egrep
-w, --word-regexp 精确匹配整个单词, 有-x参数时无效
-x, --line-regexp 精确匹配整行 = ^<u>PATTERN</u>$
-l, --file-with-matches 显示匹配文件的文件名, 不显示匹配的行
-L, --file-without-mathes 显示没有匹配文件的文件名
-h, --no-filename 显示匹配的行,但不显示文件名, 单个搜索文件时为默认参数
-H, --with-filename 显示匹配的行 + 文件名, 多个搜索文件时为默认参数
-s, --no-messages 不显示报错信息
-r, ----recursive 递归查询子目录
-m <u>NUM</u>, --max-count=NUM 最多匹配NUM次,并输出
-A <u>NUM</u>, --after-context=NUM 显示匹配行 + 它后面NUM行的内容
-B <u>NUM</u>, --before-context=NUM 显示匹配行前M行的内容 + 匹配行
-C <u>NUM</u>, --context=NUM 显示匹配行前M行的内容 + 匹配行 + 匹配行后面NUM行的内容 = -A NUM -B NUM

示例

准备测试环境

脚本 ./create_test_env.sh

#!/bin/sh

#create_test_env.sh

#create test.txt
cat > test.txt << EOF
TEST
this is a test
i am testing
#this is a comment line.

Testing testing
no one use it

nospacetesting

what if test is in the middle
#this is another comment line.
no keyword in this line
test
EOF

#make ./test_folder if not exists
destDir='./test_folder'
readonly destDir

if [ ! -d $destDir ]; then
    mkdir -p $destDir
fi

#copy test2 from test1 and copy them into ./test_folder
cp test.txt test2.txt
cp test*.txt $destDir

#create other_file.txt
echo  "12\n1\n232" > other_file.txt
$ tree
.
├── create_test_env.sh
├── other_file.txt
├── test2.txt
├── test_folder
│   ├── test2.txt
│   └── test.txt
└── test.txt
参数示例
  1. -n 参数

    匹配包含tes的行, 并显示其在输入文件/源文件的行号

    $ grep -n test test.txt 
    2:this is a test
    3:i am testing
    6:Testing testing
    9:nospacetesting
    11:what if test is in the middle
    14:test
    
  1. -c 参数

    $ grep -c test  test.txt
    6
    
  1. -i 参数

    匹配包含test(忽略大小写)的行

    $ grep -in test test.txt 
    1:TEST
    2:this is a test
    3:i am testing
    6:Testing testing
    9:nospacetesting
    11:what if test is in the middle
    14:test
    
  1. -v 参数

    取反 --- 匹配不包含test(忽略大小写)的行

    $ grep -vin test test.txt
    4:#this is a comment line
    5:
    7:no one use it
    8:
    10:
    12:#this is another comment line
    13:no keyword in this line
    
  1. -w 参数

    发现只有整个单词test被匹配, testing 则不行

    $ grep -wn test test.txt
    2:this is a test
    11:what if test is in the middle
    14:test
    
  1. -x 参数

    -x 匹配只有test的一整行 相当与 无参数匹配 ^test$

    $ grep -xn test test.txt
    14:test
    
    $ grep -n ^test$ test.txt 
    14:test
    
  1. -wx参数 同时存在

    -x参数优先级高, 同时存在会使-w失效, 应避免

    $ grep -wxn test test.txt 
    14:test
    
  1. -l 参数

    -l 参数显示包含匹配信息的文件的文件名, 一旦匹配成功,则停止对当前文件继续扫描

    如果扫描目录有有子目录会报错. 此时需要-s参数隐藏错误

    $ grep -l test *
    create_test_env.sh
    test2.txt
    grep: test_folder: Is a directory
    test.txt
    
  1. -s 参数

    $ grep -ls test *
    create_test_env.sh
    test2.txt
    test.txt
    
  1. -L 参数 对-l结果取反 => 显示没有匹配文件的文件名
```bash
$ grep -Ls test *    # * 为当前目录下的所有文件和文件夹
other_file.txt
test_folder
```
  1. -H 参数

    $ grep -H test test*txt
    test2.txt:this is a test
    test2.txt:i am testing
    test2.txt:Testing testing
    test2.txt:nospacetesting
    test2.txt:what if test is in the middle
    test2.txt:test
    test.txt:this is a test
    test.txt:i am testing
    test.txt:Testing testing
    test.txt:nospacetesting
    test.txt:what if test is in the middle
    test.txt:test
    
  2. -A, -B -C 参数

    $ grep -A2 space test.txt
    nospacetesting
    
    what if test is in the middle
    $ grep -B2 space test.txt
    no one use it
    
    nospacetesting
    $ grep -C2 space test.txt
    no one use it
    
    nospacetesting
    
    what if test is in the middle
    
  3. -r 参数

    $ grep -r space  *
    create_test_env.sh:nospacetesting
    test2.txt:nospacetesting
    test_folder/test2.txt:nospacetesting
    test_folder/test.txt:nospacetesting
    test.txt:nospacetesting
    
  4. -m 参数

    $ grep -m2 test test.txt
    this is a test
    i am testing
    
  1. -E 配合正则表达式

    $ grep -E '^test' test.txt
    test
    
    $ grep -E 'test$' test.txt
    this is a test
    test
    
    $ grep -E 'no.*test'  test.txt
    nospacetesting
    

一些练习题

  1. 去除空行

    $ grep -v '^$' test.txt 
    TEST
    this is a test
    i am testing
    #this is a comment line
    Testing testing
    no one use it
    nospacetesting
    what if test is in the middle
    #this is another comment line
    no keyword in this line
    test
    
  1. 去除注释

    $ grep -v '^#' test.txt 
    TEST
    this is a test
    i am testing
    
    Testing testing
    no one use it
    
    nospacetesting
    
    what if test is in the middle
    no keyword in this line
    test
    
  1. 显示/proc/meminfo文件中以不区分大小的s开头的行
$ grep -i '^s' /proc/meminfo 
  1. 显示/etc/passwd中以nologin结尾的行

    $ grep 'nologin$' /etc/passwd
    
  1. 显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行

    $ grep -E '^# +.*' /etc/fstab
    
  1. 显示/etc/passwd中包含了:一个数字:(即两个冒号中间一个数字)的行

    $ grep :[0-9]: /etc/passwd
    
  1. 显示/boot/grub/grub.cfg文件中以一个或多个空白字符开头的行

    $ grep -E '^ +' /boot/grub/grub.cfg
    or 
    $ grep  -E '^[[:space:]]{1,}.*' /boot/grub/grub.cfg
    
  1. 显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行

    $ grep -E '^([0-9]).*\1$' /etc/inittab
    
  1. ifconfig命令可以显示当前主机的IP地址相关的信息等,要求不包括127.0.0.1

    $ ifconfig eth0 | grep 'inet' | grep -v '127.0.0.1' | cut -d: -f10 | cut -d" " -f10
    
    
  1. 显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行;

    $ grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0
    or
    $ ifconfig eth0 | egrep -o '([0-9]+\.){3}[0-9]+' | head -1
    

参考:
https://phoenixnap.com/kb/grep-command-linux-unix-examples

https://blog.51cto.com/tsoagta/1711832
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容