问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用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

这样的问题得等大神。不过如果你用英文搜索的话,国外论坛上会有很多。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高考为什么不能补报志愿? 帮我翻译一句话“不管多久以后,不管世界变成什么样子,我都是哪个最骄傲... 温州到周口的大巴车经过台州路桥客运中心那里吗? 微信怎么设置看不到微信号 不想让微信号显示出来怎么办 2021年大学教师资格证报名费用 大埔教师资格证报名网 大埔县教育局办教师资格证需要准备哪些资料? 深情触摸2016百度云链接 求深情触摸百度云分享 win7安装第二个数据库实例如何配置监听程序和网络服务名? 信用卡逾期从储存卡扣款。但是储存是低保发放专卡。里面是我和孩子的生活费。残联发的药钱。这能不能扣? 信用卡欠银行钱逾期,家庭收入只有低保金,没有能力偿还怎么办? 我有信用卡会不会影响我家低保 厦门银行美团信用卡逾期协商延期要低保证明 银监会会不会把低保钱扣因为我欠信用卡钱? 中信银行信用卡逾期说停父母低保? 如果借壳或者重组 大股东为什么要减持 大股东减持和重组的关系 重整重组前大股东减持正常吗 LG XQB60-26S7炫彩洗衣机 显示PE警报如何解决 LG全自动洗衣机XQB70-W3TT故障代码显示PE LG双力神洗衣机开机就报警响显示PE无法使用了,是怎么回事? 怎么改qq真实名字 廉洁从业如何将表格中单元格拆分为几行 oracle 中创建监听程序、数据库、数据表、表空间、用户的顺序及登录问题 类似《重生之渣受》《竟剑之峰》的BL 小说有什么? 求类似《绝处逢生》by焦糖冬瓜的小说啊~(&#65377;&#65381;ω&#65381;&#65377;) 剧情太棒~! 求文笔好的作者及好看的作品,类似于焦糖冬瓜的文风,最好是耽美的小说,谢谢! 可以介绍几个擅长耽美强强文的作者吗?类似像焦糖冬瓜那样的。 怎么在电脑上直接登录 oracle建立数据库到最后显示监听未启动 六字真言是哪几个字? 美团可以调换站点吗- 问一问 佛教的六字真言是哪六个字 藏传佛教的六字真言是什么?每个字都代表什么? 六字真言,,那6个字? 六字真言,指的是那六个字? 美团外卖在这个站点面了试可以去其他地方的站点嘛? 美团辞职后,就不能去另外的站点了? 谁知道佛语中所谓六字真经是哪六个字? 佛家六字真言 我是美团专送现在不干了 去别的站*们说我去不了职给站长打电话他 用手机上网看小说的话,10GB能用多久啊? 美团专送要不要站点签协议 用手机看小说收费贵吗 用手机看小说一个小时通常能够看多少字?我是说通常情况下,既不一目三行,也不一字一字的看  不想美团专送了,想改一下,怎么弄? 用手机上网看小说流量大不大? 电信手机1mb流量看小说能看几分钟