用C语言如何实现 linux下 grep 命令>???
发布网友
发布时间:2022-05-01 17:19
我来回答
共5个回答
热心网友
时间:2022-06-20 05:12
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);
}
热心网友
时间:2022-06-20 05:12
继续使用管道线后面追加
| 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"
热心网友
时间:2022-06-20 05:13
我学C++的,跟C语言等同的。可是你这问题我没怎么看明白。呃___还真郁闷,用Q号做名字,我同学看到该笑话我了。抱歉哈,没能帮到你。
热心网友
时间:2022-06-20 05:13
就用C写呗 打开文件 读取一行 查找 打印 下一行。。。。其他类似
热心网友
时间:2022-06-20 05:14
这样的问题得等大神。不过如果你用英文搜索的话,国外论坛上会有很多。