gerp(1):查找文件中指定的字符串,并打印该行

本文介绍了一个简单的C语言程序,该程序模仿了Linux中grep命令的基本功能,可以在文件中搜索指定字符串并打印包含该字符串的所有行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** @autho: yj   
 *  @function: like gerp command in linux: find lines with a specified string in a file, and print these lines.
 *  @usage: ./grep [string] [filename]
 **/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX		100

int strindex(char s[], char t[]);


int main(int argc, char *argv[])
{
	int i;
	char c;
	FILE *fp;
	int found = 0;
	char str[MAX]; // keep a line read from a file
	if(argc < 3) {
		fprintf(stderr, "Not enough arguments\n");
		exit(-1);
	}
	if((fp = fopen(argv[2], "r")) == NULL) {
		fprintf(stderr, "File open failed\n");
		exit(-1);
	}
	
	/*read one line from a file*/
	while(!feof(fp)) {
		for(i=0; i<MAX-1 && (c = fgetc(fp)) != EOF && c != '\n'; i++)
		{
			str[i] = c;
		}
		if(c == '\n')
			str[i++] = '\n';
		str[i] = '\0';
		//if(c == EOF)
		//	break;
		if(strindex(str, argv[1]) >= 0) {
			printf("%s", str);
			found++;
		}
			
	}
	printf("total lines: %d\n", found);
	return found;
}


/*find position of string t[], and return position; if not exist, return -1 */
int strindex(char s[], char t[])
{
	int i, j, k;
	
	for(i=0; s[i] != '\0'; i++) {
		for(j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
		;
		if(k > 0 && t[k] == '\0') //t[k] = '\0' means completely similar
			return i;
	}
	return -1;
}


<think>我们正在讨论grep命令的-C选项。根据引用[1]和引用[3]中的信息,我们可以得到以下内容: 引用[1]中提到了grep的语法,其中包含了-C[num]选项,但并没有给出全称。 引用[3]中提到了常用选项,其中有一个选项是: -x, --line-regexp 整行匹配 但是这里并没有直接提到-C选项。 实际上,在grep的man手册中,我们可以到-C选项的全称。虽然引用中没有直接给出,但我们可以根据常见的GNU grep文档来回答。 -C选项的全称是“Context”,它用于显示匹配行及其前后若干行的内容。num指定了要显示的上下文的行数。 例如:grep -C 2 "error" log.txt 会显示每个匹配"error"的行以及它前面两行和后面两行。 因此,-C num中的C的全称是“Context”。 另外,根据引用[2],我们知道在centos7中grep默认有颜色高亮,所以-C选项输出的匹配行也会被高亮。 现在,我们来写一个示例: 假设有一个文件example.txt,内容如下: ``` line 1 line 2 error: something went wrong line 4 line 5 ``` 使用命令: ```bash grep -C 1 "error" example.txt ``` 输出将是: ``` line 2 error: something went wrong line 4 ``` 因为-C 1表示显示匹配行及其前后各1行。 最后,按照要求,我们需要生成相关问题。 注意:在回答中,我们引用了引用[1]和引用[3],但是引用[3]并没有直接提到-C选项,所以我们在回答中不添加引用标识。但是,我们可以参考引用[1]中提到了-C[num]的语法。 因此,我们在回答中会这样写: 在grep命令中,参数`-C num`中的`C`全称为**Context**,用于显示匹配行及其前后各`num`行的内容[^1]。 然后我们给出示例,并生成相关问题。</think>### `grep -C` 参数详解 `grep -C num` 中的 `C` 全称为 **Context**(上下文),用于显示匹配行及其**前后各 `num` 行**的内容。该选项在分析日志或代码时特别有用,可快速定位问题上下文。 #### 核心特性 1. **全称含义** `-C` = `--context`(上下文模式) *通过 `grep --help` 可验证:* ```bash grep --help | grep context # 输出:-C, --context=NUM print NUM lines of output context ``` 2. **工作方式** ```bash grep -C 2 "error" app.log ``` - ✅ 匹配包含 `error` 的行 - ✅ 额外显示匹配行**前 2 行**和**后 2 行** - ❌ 不匹配的行会被过滤掉 --- ### 实际示例 #### 测试文件 `app.log` ```log 2023-10-01 08:00:00 [INFO] System started 2023-10-01 08:01:23 [DEBUG] Loading config 2023-10-01 08:02:15 [ERROR] Database timeout 👈 目标行 2023-10-01 08:02:30 [WARN] Retrying connection 2023-10-01 08:03:05 [INFO] Operation completed ``` #### 执行命令 ```bash grep -C 1 "timeout" app.log ``` #### 输出结果 ```log 2023-10-01 08:01:23 [DEBUG] Loading config 👈 前1行 2023-10-01 08:02:15 [ERROR] Database timeout 👈 匹配行 2023-10-01 08:02:30 [WARN] Retrying connection 👈 后1行 ``` --- ### 进阶用法 1. **组合其他选项** ```bash grep -C 2 -i "timeout" app.log # 忽略大小写并显示2行上下文 ``` 2. **等价命令** `-C num` 等价于同时使用 `-A num`(后文)和 `-B num`(前文): ```bash grep -A 1 -B 1 "timeout" app.log # 效果同 -C 1 ``` 3. **高亮显示** 在 CentOS 等系统中默认开启匹配高亮(如引用[2]所述),无需额外参数[^2]。 --- ### 注意事项 - 当匹配行位于文件开头/结尾时,只会显示实际存在的上下文行 - 多个匹配相邻时,上下文行会**自动合并**避免重复显示 - 默认输出格式:用 `--` 分隔不同匹配块(可通过 `--no-group-separator` 禁用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值