用C语言如何实现 linux下 grep 命令>?????

用C语言如何实现linux下grep命令>?????跪求!创建mygrep,syntax像mygrep[OPTION]STRIN要用到以下的voidgrep_stream... 用C语言如何实现 linux下 grep 命令>????? 跪求!
创建 mygrep,
syntax 像mygrep [OPTION] STRIN
要用到以下的
void grep_stream(FILE *fpntr, char *string)
– fpntr – an open file stream;
– string – the search string as a valid C string;
• char *get_next_line(FILE *fpntr)
– fpntr – an open file stream;G [FILE...]., 如果没有文件, 就读取input
展开
 我来答
L_o_o_n_i_e
2011-02-11 · TA获得超过4.2万个赞
知道大有可为答主
回答量:8507
采纳率:38%
帮助的人:5246万
展开全部
linux 应当是开放系统,也许可以找到源程序。
我曾写过一个有部分 grep 功能 的程序grep_string.c,用于搜同一文件夹 文件内的字符串
若搜到,则显示文件名,行号,行的内容。
程序如下:
/* ======================================================================*
* grep_string.c
* PC DOSprompt tool, partly similar to unix grep:
* grep string files
* where files is the file names used in DIR command
* open a temp file to store the file names in the file
* read each file name and open/grep/close it
* if match the string, print the line number and the line.
* -------------------------------------------------------------
* call ERASE/F grep_str_temp.tmp
* call DIR/B/A-D *
* L_o_o_n_i_e 2000-Nov
* ======================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Buff_size 40960
int DEBUG=0;

FILE *fin;
FILE *fout;
FILE *fname;
char namein[72], nameout[72], namelist[72];
char current_dir[72];
char current_file_name[72];
char target_string[64];
int L_dir; /* Length of current_dir\files string */
int L_target; /* Length of searched string */
int L_row; /* Length of the row fgets just got */
int L_filename; /* Length of current file name */
char *buff;

void init();
void message1(char * progname);
void search(char * target_string);
void clean_it(char * buff, int N_size);

main (int argc, char *argv[])
{
char command[200];
int I_file = 0;

if (argc < 3) (void) message1( argv[0] ); /* argc < 3, print usage and exit */
(void) init(); /* alloc buff */

strcpy(namelist,"C:\\temp\\grep_str_temp.tmp");
strcpy(current_dir, argv[2]);
strcpy(target_string, argv[1]);
L_target = strlen(target_string);

if (DEBUG == 1) {
printf("grep \"%s\" %s\n", target_string, current_dir);
printf("the length of target_string is: %d\n",L_target);
};

/* ------------------------------------------------------------*
* get name list and saved in grep_string_temp.tmp
* ------------------------------------------------------------*/
sprintf(command,"DIR/B/A-D %s > %s", current_dir, namelist);
system(command);
if ( (fname = fopen(namelist,"r") ) == NULL ) {
printf("\007Cann't open work file: %s ", namelist);exit(1);
};

while ( fgets( current_file_name, 72, fname) !=NULL ) {

strncpy(namein, current_file_name, strlen(current_file_name) - 1 );

if (DEBUG == 1) {
printf( "\007I will open %s and search \"%s\"\n", namein, target_string);
};

if ( (fin = fopen(namein,"r") ) == NULL ) {
printf("\007Cann't open current file: %s ", namein);
goto the_end_of_loop;
};
(void) search( target_string );
fclose(fin);
the_end_of_loop: ;
(void) clean_it( current_file_name, 72);
(void) clean_it( namein, 72);
}; /* end of main while loop */

fclose(fname);

if (DEBUG == 0 ) {
sprintf(command,"ERASE/F %s", namelist);
system(command);
};
exit(0);

} /* the End of main program */

/* =================================================================*
* init()
* init global
* L_o_o_n_i_e
* =================================================================*/
void init()
{
L_dir = 0;
L_target = 0;
L_row = 0;
L_filename;
buff = (char *) malloc( Buff_size * sizeof (char));
if (!buff) {
printf("\007No enough memory -- Can not alloc the Buff\n");
exit(2);
};
}
void message1 (char * progname)
{
fprintf(stderr, "========================================================\n");
fprintf(stderr, "The prog searchs a string in files\n");
fprintf(stderr, "If found the string then print the line on screen\n");
fprintf(stderr, "search a string in Chinese GB 8bit bytes is allowed\n");
fprintf(stderr, "\007Usage: %s targetstring files\n", progname);
fprintf(stderr, "For example: %s cgi-bin A*.html\n", progname);
fprintf(stderr, "For example: %s ÖDIÄ A*.html\n", progname);
fprintf(stderr, "Limit: maximum line width is %d bytes\n", Buff_size);
fprintf(stderr, "L_o_o_n_i_e 2000-Nov\n");
fprintf(stderr, "========================================================\n");
exit(1);
}

/* =====================================================================*
* search the target string
* L_target == target_string lenth
* LL == the line length
* if L_target >= LL skip the line
* otherwise loop:
i = 0 to LL - L_target
comp (buff[i],atrget_string,L_target)
if find, then output and goto next
* L_o_o_n_i_e
* ========================================================================*/

void search(char * target_string)
{
int i,j,NN;
int LL;
int ii;
int flag_print_name = 0;
NN = 0;
while ( fgets( buff, Buff_size, fin) !=NULL ) {
LL = 0;
LL = strlen(buff);
NN = NN + 1;
ii = LL - L_target;
if (ii < 0 ) goto Lab1;
for (i=0;i<ii;i++) {
if ( strncmp( &buff[i], target_string, L_target) == 0 ) {
if (flag_print_name == 0) {
printf("In %s\n",namein);
flag_print_name = 1;
};
printf("Line: %d: %s\n", NN, buff);
goto Lab1;
};
};
Lab1:;
(void) clean_it( buff, Buff_size);
};
if (DEBUG == 1) printf("%d lines, last row length=%d\n",NN,LL);

}

void clean_it(char * buff, int N_size)
{
int i;
for (i=0; i< N_size; i++) strncpy(&buff[i], "\0",1);
}
wvsju60
2011-02-12 · TA获得超过357个赞
知道答主
回答量:193
采纳率:0%
帮助的人:174万
展开全部
继续使用管道线后面追加
| cut -d = -f 2
详情请查阅cut的manpage

摘选一段
CUT(1) FSF CUT(1)

NAME
cut - 在文件的每一行中提取片断

总览 (SYNOPSIS)
../src/cut [OPTION]... [FILE]...

描述 (DESCRIPTION)
在 每个文件 FILE 的 各行 中, 把 提取的 片断 显示在 标准输出.

-b, --bytes=LIST
输出 这些 字节

-c, --characters=LIST
输出 这些 字符

-d, --delimiter=DELIM
使用 DELIM 取代 TAB 做 字段(field) 分隔符

-f, --fields=LIST
输出 这些 字段

-n (忽略)

-s, --only-delimited
不显示 没有 分隔符 的 行

--output-delimiter=STRING
使用 STRING 作为 输出分隔符, 缺省 (的 输出分隔符) 为 输入分隔符

--help 显示 帮助信息, 然后 结束

--version
显示 版本信息, 然后 结束

我写了一段,不过我的mplayer似乎没有-endops选项,大小写变幻采用专门的convertstr函数完成

#!/bin/bash

convertstr ()
{
if [ $1 = "XVID" ] ; then
echo "XviD"
elif [ $1 = "DX50" ] ; then
echo "dx50"
else
echo $1
fi
}

FORMAT=$(convertstr $(mplayer -identify -frames 5 -vo null $1 2> /dev/null | grep ID_VIDEO_FORMAT | awk '' | cut -d = -f 2))
echo "编码格式:$FORMAT"
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
578750704
2011-02-11
知道答主
回答量:10
采纳率:0%
帮助的人:0
展开全部
我学C++的,跟C语言等同的。可是你这问题我没怎么看明白。呃___还真郁闷,用Q号做名字,我同学看到该笑话我了。抱歉哈,没能帮到你。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhang92010
2011-02-16
知道答主
回答量:72
采纳率:0%
帮助的人:23万
展开全部
就用C写呗 打开文件 读取一行 查找 打印 下一行。。。。其他类似
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
元初晴014
2011-02-11 · TA获得超过2174个赞
知道小有建树答主
回答量:589
采纳率:0%
帮助的人:610万
展开全部
这样的问题得等大神。不过如果你用英文搜索的话,国外论坛上会有很多。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式