【正则表达式初探】grep 命令避免匹配自身
最近遇到了一个问题,即使用grep命令获取xxx进程的pid时,同时返回了xxx进程的pid和grep xxx进程的pid,原因是grep xxx也会作为一个进程运行,对xxx的查找包含了grep xxx.(不要问我为什么不用pgrep或者grep -w,问就是没有。
实际中使用的命令如下:
ps | grep init | awk {'if($1 \!\= 1)print $1'}
解决方法可以使用正则表达式,及使用'[]'
对进程名进行修饰,修改如下:
ps | grep '[i]nit' | awk {'if($1 \!\= 1)print $1'}
其中[i]
表示匹配i
字符,[i]nit
匹配上init,而grep init
命令从字符上就成了grep '[i]nit'
,因此对init的匹配就不会匹配到grep init命令了。
附一个杀进程的c语言程序
char command[50];
FILE *fp;
const char *process_names[2] = {"[i]nit", "[h]ello"};
sprintf(command, "ps | grep '%s'| awk {'if($1 != 1)print $1'}", process_names[0]);
fp = popen(command, "r");
if (fp == NULL)
{perror("Error opening pipe");
}
pid_t pid;
fscanf(fp, "%d", &pid);
pclose(fp);
if (pid > 0)
{if (kill(pid, SIGTERM) == 0){printf("PID %d (%s) is killed!\n", pid, process_names[0]);}else{perror("Error kill!");}
}