日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

grep 正则表达式及选项以及注意

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 grep 正则表达式及选项以及注意 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:在原文基礎上稍作了修改


grep命令簡介:

在ex編輯器(我沒用過)中,啟動ex編輯器后要查找某個字符串時,在ex的命令提示符后鍵入:

:/pattern/p
:/g/pattern/p

grep這個名字就由來如此。其中p的含義是print,而當g出現在pattern前面的時候,其含義是“文件中所有行”,或“執行全局替換”。

被查找的模式稱作正則表達式(regular expression)因此,把pattern換成RE,于是就成了g/RE/p,grep

grep命令語法:

前面的名字由來部分已經明確告訴我們,grep的作用是在一個或多個文件中查找茉個字符模式。egrep和fgrep都只是grep的變體,這里我們不做介紹。看一下grep的語法結構。


#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
? ? int pfd[2];
? ? pid_t cpid;
? ? char buf;
? ? if(argc != 2)
? ? {
? ? ? ? fprintf(stderr,"Usage: %s <string>\n",argv[0]);
? ? ? ? exit(0);
? ? }
? ? if (pipe(pfd) == -1)
? ? {
? ? ? ? perror("pipe");
? ? ? ? exit(EXIT_FAILURE);
? ? }
? ? cpid = fork();
? ? if (cpid == -1)
? ? {
? ? ? ? perror("fork");
? ? ? ? exit(EXIT_FAILURE);
? ? }
? ? if (cpid == 0)
? ? {
? ? ? ? close(pfd[1]); ? ? ? ? ?/* Close unused write end */
? ? ? ? while (read(pfd[0], &buf, 1) > 0)
? ? ? ? ? ? write(STDOUT_FILENO, &buf, 1);
? ? ? ? write(STDOUT_FILENO, "\n", 1);
? ? ? ? close(pfd[0]);
? ? ? ? exit(EXIT_SUCCESS);
? ? }
? ? else
? ? {
? ? ? ? close(pfd[0]); ? ? ? ? ?/* Close unused read end */
? ? ? ? write(pfd[1], argv[1], strlen(argv[1]));
? ? ? ? close(pfd[1]); ? ? ? ? ?/* Reader will see EOF */
? ? ? ? wait(NULL); ? ? ? ? ? ? /* Wait for child */
? ? ? ? exit(EXIT_SUCCESS);
? ? }
}
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
? ? int pfd[2];
? ? pid_t cpid;
? ? char buf;
? ? if(argc != 2)
? ? {
? ? ? ? fprintf(stderr,"Usage: %s <string>\n",argv[0]);
? ? ? ? exit(0);
? ? }
? ? if (pipe(pfd) == -1)
? ? {
? ? ? ? perror("pipe");
? ? ? ? exit(EXIT_FAILURE);
? ? }
? ? cpid = fork();
? ? if (cpid == -1)
? ? {
? ? ? ? perror("fork");
? ? ? ? exit(EXIT_FAILURE);
? ? }
? ? if (cpid == 0)
? ? {
? ? ? ? close(pfd[1]); ? ? ? ? ?/* Close unused write end */
? ? ? ? while (read(pfd[0], &buf, 1) > 0)
? ? ? ? ? ? write(STDOUT_FILENO, &buf, 1);
? ? ? ? write(STDOUT_FILENO, "\n", 1);
? ? ? ? close(pfd[0]);
? ? ? ? exit(EXIT_SUCCESS);
? ? }
? ? else
? ? {
? ? ? ? close(pfd[0]); ? ? ? ? ?/* Close unused read end */
? ? ? ? write(pfd[1], argv[1], strlen(argv[1]));
? ? ? ? close(pfd[1]); ? ? ? ? ?/* Reader will see EOF */
? ? ? ? wait(NULL); ? ? ? ? ? ? /* Wait for child */
? ? ? ? exit(EXIT_SUCCESS);
? ? }
}

grep使用的正則表達式元字符:

正則表達式中的元字符,我之前在javascript的日志中詳細介紹過。這里不再解釋何為正則表達式,只讓大家來看一下在grep中使用的正則表達式元字符。

元字符功能示例匹配對象
^行首定位符‘^simaopig%’匹配所有以simaopig開頭的行
$行尾定位符‘simaopig$’匹配所有以simaopig結尾的行
.匹配任意一個字符‘s.m’匹配包含一個s字符,后面跟一個字符(隨意),再跟一個m的行
*匹配0或多個前一字符‘s*m’匹配包含零個或多個s字符,后面跟有一個m字符的行
[]匹配一組字符中的任意一個‘[Ss]imaopig’匹配simaopig,或者Simaopig
[^]匹配不在指定字符組內的字符‘[^a-z]imaopig’匹配不包含在a-z之間的字符后跟著imaopig的行,即所有aimaopig-zimaopig的行都不包含(有點繞)
\<詞首定位符‘\<simaopig’匹配以simaopig為開頭的詞的行,simaopigabcd也是可以的
\>詞尾定位符‘simaopig\>’匹配以simaopig為結尾的詞的行,abcdsimaopig也是可以的
\(..\)標記匹配的字符‘\(simaopig\)'s blog’標記寄存器里的一段字符,該寄存器被記作1號寄存器。以后引用這段字符時,可以使用\1來重復該模式。9個標簽中最左邊的是第一號。例如,模式simaopig被保存在1號寄存器里,之后用\1來引用它。
x\{m\}或x\{m,\}或x\{m,n\}字符x的重復出現‘s\{5\}’,'s\{5,\}’,'s\{5,10\}’匹配連續出現5個s、至少5個s或5到10個s的行

grep的選項:

觀其語法結構,grep有著很豐富的選項。下面的表格中我會為大家介紹其常用的選項。

選項功能
-b在每一行前面加上其所在的塊號,根據上下文定位磁盤塊時可能會用到
-c顯示匹配到的行的數目,而不是顯示行的內容
-h不顯示文件名
-i比較字符時忽略大小寫的區別
-l(小寫的字母L)只列出匹配行所在文件的文件名(每個文件名只列一次),文件名之間用換行符分隔
-n在每一行前面加上它在文件中的相對行號
-s無聲操作,即只顯示報錯信息,用于檢查退出狀態
-v反向查找,只顯示不匹配的行
-w把表達式作為詞來查找,就好像它被\<和\>夾著那樣。只適用于grep(并非所有版本的grep都支持這一功能,譬如,SCO UNIX就不支持)

grep簡單示例:

例如第一個表格中,我想查找所有帶有if的行并且顯示行號,如何查找呢?

grep?-n?if a.html

輸出:


使用過程中,使用最多的參數就是 -v ,但是用著并不爽。

比如說,我想查找一個單詞“UserService”,但是像”*.svn” 這種文件就不用顯示了,我該怎么做呢?

grep?-r?"UserService"?./?|?grep?-v?"svn"

但是,如果類似于含有”test、auto_load”之類的文件我也不顯示,怎么做呢?我之前的做法是:

grep?-r?"UserService"?./?|?grep?-v?"svn"?|?grep?-v?"test"?|?grep?-v?"auto_load"

命令很長,而且麻煩,于是就想,grep本身是按照正則表達式來當做選項的,那么我是不是可以利用到正則表達式的“或|”命令?

grep?-r?"UserService"?./?|?grep?-v?"svn|test|auto_load"

很顯示,執行結果顯示上面的命令不符合我的需求,于是苦思不得其解。原來,在使用正則表達式選項時,要記得將”|”轉義。最終命令如下:

grep?-r?"UserService"?./?|?grep?-v?"svn\|prj\|test\|auto_load"

聲明:?本文采用?BY-NC-SA?協議進行授權 |?小小子
轉載轉自《grep 正則表達式及選項》和《grep 正則表達式選項要記得轉義》

總結

以上是生活随笔為你收集整理的grep 正则表达式及选项以及注意的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。