grep命令簡介:
在ex編輯器(我沒用過)中,啟動ex編輯器後要查找某個字符串時,在ex的命令提示符後鍵入:
:/pattern/pgrep這個名字就由來如此。其中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中使用的正則表達式元字符。
grep的選項:
觀其語法結構,grep有著很豐富的選項。下面的表格中我會為大家介紹其常用的選項。
grep簡單示例:
例如第一個表格中,我想查找所有帶有if的行並且顯示行號,如何查找呢?
grep -n if a.html輸出:
使用過程中,使用最多的參數就是 -v ,但是用著並不爽。
比如說,我想查找一個單詞“UserService”,但是像”*.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 正則表達式選項要記得轉義》