成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux進階必學知識:grep是什么?怎么用?

系統
經常讀一些介紹unix命令的文章,但是文章所舉的例子普遍價值不大,這就導致了看完了文章后我們并不知道如何有效地運用這些unix命令。

經常讀一些介紹unix命令的文章,但是文章所舉的例子普遍價值不大,這就導致了看完了文章后我們并不知道如何有效地運用這些unix命令。

寫在前面

三年前,作為面試官,我負責招聘unix系統管理員。那次來競聘該崗位的共有8個人,其中兩人是技術***的自由職業者。我認為系統管理員沒必要把所有的配置方法熟記于心,需要某個軟件的時候,只要你想把它玩轉并且玩得更酷,多讀些文章,你便會自然而然地熟悉它的各種用法與配置。于是,我讓這些應聘者解決下面兩個問題:

  1. 創建一個例行任務,它在每個偶數點(比如2點、12點)和3點執行;
  2. 通過/var/run/dmesg.boot文件打印處理器信息。

讓我吃驚的是,8位應聘者中沒有一個人能解決上述問題,其中兩人竟對grep命令一無所知。

介于此,我們就好好說說grep。

首先,以下所有的操作都是基于grep 2.5.1-FreeBSD:

  1. # grep --version | grep grep
  2. grep (GNU grep) 2.5.1-FreeBSD

有必要先交待下grep版本,因為某些用法只限定于特定的版本:

  1. # man grep | grep -iB 2 freebsd

  2. -P, --perl-regexp

  3. Interpret PATTERN as a Perl regular expression. This option is

  4. not supported in FreeBSD.

好了,言歸正傳,我們經常會這樣grep文件:

  1. root@nm3:/ # cat /var/run/dmesg.boot | grep CPU:
  2. CPU: Intel Core(TM)2 Quad CPU Q9550 @ 2.83GHz (2833.07-MHz K8-class CPU)

還可以這樣做:

  1. root@nm3:/ # grep CPU: /var/run/dmesg.boot
  2. CPU: Intel Core(TM)2 Quad CPU Q9550 @ 2.83GHz (2833.07-MHz K8-class CPU)

這樣也是可以的(雖然我很討厭這種操作方式):

  1. root@nm3:/ # </var/run/dmesg.boot grep CPU:
  2. CPU: Intel Core(TM)2 Quad CPU Q9550 @ 2.83GHz (2833.07-MHz K8-class CPU)

你肯定會遇到這樣的場景:統計文件中帶有某些關鍵字的行出現的次數。grep+wc可以幫到你:

  1. root@nm3:/ # grep WARNING /var/run/dmesg.boot | wc -l
  2. 3

條條大路通羅馬,下面是另一條路:

  1. root@nm3:/ # grep WARNING /var/run/dmesg.boot -c
  2. 3

下面我們新建一個測試用的文檔:

  1. root@nm3:/ # grep ".*" test.txt
  2. one two three
  3. seven eight one eight three
  4. thirteen fourteen fifteen
  5. sixteen seventeen eighteen seven
  6. sixteen seventeen eighteen
  7. twenty seven
  8. one 504 one
  9. one 503 one
  10. one 504 one
  11. one 504 one
  12. #comment UP
  13. twentyseven
  14. #comment down
  15. twenty1
  16. twenty3
  17. twenty5
  18. twenty7

繼續grep的搜索之旅。

-w選項指定要搜索的單詞:

  1. root@nm3:/ # grep -w 'seven' test.txt
  2. seven eight one eight three
  3. sixteen seventeen eighteen seven
  4. twenty seven

如果想搜以特定字符開頭(結尾)的單詞,可以這樣:

  1. root@nm3:/ # grep '<seven' test.txt
  2. seven eight one eight three
  3. sixteen seventeen eighteen seven
  4. sixteen seventeen eighteen
  5. twenty seven
  6. root@nm3:/ # grep 'seven>' test.txt
  7. seven eight one eight three
  8. sixteen seventeen eighteen seven
  9. twenty seven
  10. twentyseven

如果想搜以特定字符開頭(結尾)的行,可以這樣:

  1. root@nm3:/ # grep '^seven' test.txt
  2. seven eight one eight three
  3. root@nm3:/ # grep 'seven$' test.txt
  4. sixteen seventeen eighteen seven
  5. twenty seven
  6. twentyseven
  7. root@nm3:/ #

想要顯示目標行的上下文嗎?

  1. root@nm3:/ # grep -C 1 twentyseven test.txt
  2. #comment UP
  3. twentyseven
  4. #comment down

到底是顯示上文還是下文?

  1. root@nm3:/ # grep -A 1 twentyseven test.txt
  2. twentyseven
  3. #comment down
  4. root@nm3:/ # grep -B 1 twentyseven test.txt
  5. #comment UP
  6. twentyseven

我們還可以這樣玩grep:

  1. root@nm3:/ # grep "twenty[1-4]" test.txt
  2. twenty1
  3. twenty3

或者取非:

  1. root@nm3:/ # grep "twenty[^1-4]" test.txt
  2. twenty seven
  3. twentyseven
  4. twenty5
  5. twenty7

grep是個強大的指令,除上述列舉的之外,它還支持許多限定符、通配符以及正則表達式。下面是一些例子:

  1. root@nm3:/ # cat /etc/resolv.conf
  2. #options edns0
  3. #nameserver 127.0.0.1
  4. nameserver 8.8.8.8
  5. nameserver 77.88.8.8
  6. nameserver 8.8.4.4

只獲取IP地址相關的行:

  1. root@nm3:/ # grep -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" /etc/resolv.conf
  2. #nameserver 127.0.0.1
  3. nameserver 8.8.8.8
  4. nameserver 77.88.8.8
  5. nameserver 8.8.4.4

上面的方法可行,但下面這種方法更好:

  1. root@nm3:/ # grep -E 'b[0-9]{1,3}(.[0-9]{1,3}){3}b' /etc/resolv.conf
  2. #nameserver 127.0.0.1
  3. nameserver 8.8.8.8
  4. nameserver 77.88.8.8
  5. nameserver 8.8.4.4

希望去掉注釋行?

  1. root@nm3:/ # grep -E 'b[0-9]{1,3}(.[0-9]{1,3}){3}b' /etc/resolv.conf | grep -v '#'
  2. nameserver 8.8.8.8
  3. nameserver 77.88.8.8
  4. nameserver 8.8.4.4

只要IP:

  1. root@nm3:/ # grep -oE 'b[0-9]{1,3}(.[0-9]{1,3}){3}b' /etc/resolv.conf | grep -v '#'
  2. 127.0.0.1
  3. 8.8.8.8
  4. 77.88.8.8
  5. 8.8.4.4

哎呀,被注釋掉的127.0.0.1又回來了,這是指令執行順序不當導致的,怎么破?

  1. root@nm3:/ # grep -v '#' /etc/resolv.conf | grep -oE 'b[0-9]{1,3}(.[0-9]{1,3}){3}b'
  2. 8.8.8.8
  3. 77.88.8.8
  4. 8.8.4.4

下面看下-v(反向查找)選項的使用。

假設要執行指令“ps –afx | grep ttyv ”:

  1. root@nm3:/ # ps -afx | grep ttyv
  2. 1269 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1
  3. 1270 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2
  4. 1271 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3
  5. 1272 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4
  6. 1273 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5
  7. 1274 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6
  8. 1275 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7
  9. 48798 2 S+ 0:00.00 grep ttyv

OK,但是我們不需要“48798 2 S+ 0:00.00 grep ttyv”一行,使用-v:

  1. root@nm3:/ # ps -afx | grep ttyv | grep -v grep
  2. 1269 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1
  3. 1270 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2
  4. 1271 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3
  5. 1272 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4
  6. 1273 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5
  7. 1274 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6
  8. 1275 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7

看著不爽?現在呢?

  1. root@nm3:/ # ps -afx | grep "[t]tyv"
  2. 1269 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1
  3. 1270 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2
  4. 1271 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3
  5. 1272 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4
  6. 1273 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5
  7. 1274 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6
  8. 1275 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7

別忘了| (或)符號:

  1. root@nm3:/ # vmstat -z | grep -E "(sock|ITEM)"
  2. ITEM SIZE LIMIT USED FREE REQ FAIL SLEEP
  3. socket: 696, 130295, 30, 65, 43764, 0, 0

殊途同歸:

  1. root@nm3:/ # vmstat -z | grep "sock|ITEM"
  2. ITEM SIZE LIMIT USED FREE REQ FAIL SLEEP
  3. socket: 696, 130295, 30, 65, 43825, 0, 0

許多人都會在grep中用正則表達式,但你仍會忘了用POSIX字符集,即便它們也非常有用。

POSIX:

  1. [:alpha:] Any alphabetical character, regardless of case
  2. [:digit:] Any numerical character
  3. [:alnum:] Any alphabetical or numerical character
  4. [:blank:] Space or tab characters
  5. [:xdigit:] Hexadecimal characters; any number or A–F or a–f
  6. [:punct:] Any punctuation symbol
  7. [:print:] Any printable character (not control characters)
  8. [:space:] Any whitespace character
  9. [:graph:] Exclude whitespace characters
  10. [:upper:] Any uppercase letter
  11. [:lower:] Any lowercase letter
  12. [:cntrl:] Control characters

找有大寫字母的行:

  1. root@nm3:/ # grep "[[:upper:]]" test.txt
  2. #comment UP

搜索結構不夠醒目?高亮顯示:

 

更多的grep小竅門。***個稍顯專業,我已經15年沒用過了。

選擇包含six,seven或者eight的行,很簡單:

  1. root@nm3:/ # grep -E "(six|seven|eight)" test.txt
  2. seven eight one eight three
  3. sixteen seventeen eighteen seven
  4. sixteen seventeen eighteen
  5. twenty seven
  6. twentyseven

那么現在只選擇包含six,seven或者eight若干次的行。這種用法叫回溯引用:

  1. root@nm3:/ # grep -E "(six|seven|eight).*1" test.txt
  2. seven eight one eight three
  3. sixteen seventeen eighteen seven

第二個竅門,這個更有用一些。打印504前后有tab的行(如果PCRE能夠支持這個特性就好了)。

POSIX字符集在此失效了:

  1. root@nm3:/ # grep "[[:blank:]]504[[:blank:]]" test.txt
  2. one 504 one
  3. one 504 one
  4. one 504 one

[CTRL+V][TAB]生效:

  1. root@nm3:/ # grep " 504 " test.txt
  2. one 504 one

我漏講什么了嗎?grep具備遞歸搜索文件/目錄功能。如果我們想在源碼目錄中搜索允許Intel使用外部SFPs的代碼,但是又沒清楚完整地記著函數名allow_unsupported_stp和unsupported_allow_sfp。腫么辦?這正是grep的菜:

  1. root@nm3:/ # grep -rni allow /usr/src/sys/dev/ | grep unsupp
  2. /usr/src/sys/dev/ixgbe/README:75:of unsupported modules by setting the static variable 'allow_unsupported_sfp'
  3. /usr/src/sys/dev/ixgbe/ixgbe.c:322:static int allow_unsupported_sfp = TRUE;
  4. /usr/src/sys/dev/ixgbe/ixgbe.c:323:TUNABLE_INT("hw.ixgbe.unsupported_sfp", &allow_unsupported_sfp);
  5. /usr/src/sys/dev/ixgbe/ixgbe.c:542: hw->allow_unsupported_sfpallow_unsupported_sfp = allow_unsupported_sfp;
  6. /usr/src/sys/dev/ixgbe/ixgbe_type.h:3249: bool allow_unsupported_sfp;
  7. /usr/src/sys/dev/ixgbe/ixgbe_phy.c:1228: if (hw->allow_unsupported_sfp == TRUE) {

希望你還沒暈,因為這些grep用法只是grep的冰山一角呢!

***祝大家 Happy grepping!

原文鏈接:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.techug.com%2F

責任編輯:牛小雨 來源: 程序師
相關推薦

2023-07-18 09:03:01

RocketMQ場景消息

2015-07-23 09:20:19

mmap

2022-04-07 11:27:15

數字孿生VR系統AI

2015-08-26 14:15:12

數據挖掘

2017-04-03 15:35:13

知識體系架構

2022-09-16 11:33:40

數據分析MVP

2010-03-18 15:19:27

Linux命令

2010-03-18 16:06:19

Linux命令

2010-03-18 16:13:58

Linux命令

2010-03-18 17:00:57

Linux命令

2019-06-05 15:20:00

MongoDBNoSQL數據庫

2011-03-29 14:11:20

Cacti基礎知識

2020-08-10 07:44:13

虛擬內存交換內存Linux

2017-04-14 10:11:37

閃存備份用例

2022-11-04 11:44:56

WebFluxCURDWeb

2023-10-31 08:21:18

WebFlux基本用法JPA

2023-03-02 08:48:43

Linuxsubshell

2021-12-20 14:56:07

LinuxTTY

2010-06-21 15:49:59

Linux apt是什

2015-02-09 16:09:00

布線施工順序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品视频免费观看 | www.成人在线视频 | av网站观看| www.青娱乐| 国产精品美女久久久久久久久久久 | 伊人一区| 婷婷色网 | 午夜影院在线观看 | 亚洲91 | 久久综合一区 | 伊人亚洲 | 日本一区二区在线视频 | 色视频在线免费观看 | 国产激情一区二区三区 | 国产电影一区二区 | 中文字幕在线视频免费视频 | 国产欧美精品一区二区色综合朱莉 | 亚洲成人三区 | 亚洲男人的天堂网站 | 欧美视频免费在线 | 欧美精品久久久久 | 日日噜噜噜夜夜爽爽狠狠视频, | 免费黄色录像视频 | 天天成人综合网 | 最新黄色毛片 | 亚洲精品日韩在线观看 | 国产精品视频一区二区三区 | 国产精品揄拍一区二区 | 在线观看免费黄色片 | 99热精品久久 | 欧美日韩中文字幕在线 | 欧美午夜一区 | 日韩欧美国产一区二区 | 中文字幕不卡一区 | 久久久国产亚洲精品 | 99在线国产 | 欧美高清性xxxxhd | 精品自拍视频 | 激情伊人网 | 亚洲视频在线观看一区二区三区 | 国产亚洲精品精品国产亚洲综合 |