Linux 中的cut命令详解及C/C++代码实现

Linux cut命令是一个文本处理命令。此命令用于从文件中提取特定列。需要使用命令定义列号和列分隔符。

基于Linux的操作系统提供了许多命令行文本处理实用程序,可以在日常工作中使用。cut命令就是这样一个文本操作实用程序。

cut命令概述
cut命令从文件的每一行中剪切字节、字符和字段,并将这些字节、字符及字段写入标准输出。
如果未指定“文件”参数,则cut命令将读取标准输入-B、 必须指定-c或-f。

cut使用以下基本语法:

cut < option> < file>


下面是一些切割命令的示例,有助于更好地了解cut及其功能。

从字符串中提取特定字符

-b选项用于指定字节。字节范围可以用连字符(-)指定。制表符和退格也被视为每个字符。 如下所示:

请注意,如果cut命令使用b选项,则在执行此命令时,cut命令首先对b之后的所有位置进行排序,然后提取它们。定位顺序不能颠倒。


-3表示从第一个字节到第三个字节,3-表示从第三个字符到行的末尾。

字节或字符的剪切范围

根据字符在文本中的位置提取字符。使用-c选项,后跟需要获取的字符序列/顺序。


从开始或结束位置提取文本

使用-cn-选项从第n个字符开始提取到行尾的文本,其中n是字符串中某个字符的索引

例如,要提取从第三个字符到行尾的字符串

使用分隔符提取文本

可以使用-d标志指定带有-f选项的分隔符。分隔符指定用于分隔文本文件中的字段的字符。例如,要提取/etc/passwd文件的第一列,请使用冒号(:)作为分隔符:


可以看到,使用-d将分隔符设置为冒号,然后使用-f设置我想作为第一个域的内容。事实上,cut -d选项的默认分隔符是一个制表符,所以当您想使用制表符时,可以省略-d选项,直接使用-f来检索域。

从文件中剪切多个字段

可以使用-f选项打印文件中的多个字段

不显示没有分隔符 的 行

仅当行包含分隔符时,使用-s标志提取字段。例如,以下命令不会获取字段-f 1,除非它有空格分隔符:


相反,提到的命令将生成一个输出,因为字符串包含指定的分隔符。

cut命令C/C++实现

..
int main(int argc, char *argv[])
{


	while ((ch = getopt(argc, argv, "b:c:d:f:snw")) != -1)
		switch(ch) {
		case 'b':
				   /*构建字节列表*/
			get_list(optarg);
			bflag = 1;
			break;
		case 'c':
		   /*构建字节列表*/
			get_list(optarg);
			cflag = 1;
			break;
		case 'd':
				/*新分隔符*/
			/*将-d“”解释为“使用NUL字节作为分隔符”*/
			n = mbrtowc(&dchar, optarg, MB_LEN_MAX, NULL);
			if (dchar == '\0' || n != strlen(optarg))
				errx(1, "bad delimiter");
			strcpy(dcharmb, optarg);
			dflag = 1;
			break;
		case 'f':
		   /*构建字段列表*/
			get_list(optarg);
			fflag = 1;
			break;
		case 's':
			sflag = 1;
			break;
		case 'n':
			nflag = 1;
			break;
		case 'w':
			wflag = 1;
			break;
		case '?':
		default:
			usage();
		}
	argc -= optind;
	argv += optind;

	if (fflag) {
		if (bflag || cflag || nflag || (wflag && dflag))
			usage();
	} else if (!(bflag || cflag) || dflag || sflag || wflag)
		usage();
	else if (!bflag && nflag)
		usage();

	if (fflag)
		fcn = f_cut;
	else if (cflag)
		fcn = MB_CUR_MAX > 1 ? c_cut : b_cut;
	else if (bflag)
		fcn = nflag && MB_CUR_MAX > 1 ? b_n_cut : b_cut;

	rval = 0;
	if (*argv)
		for (; *argv; ++argv) {
			if (strcmp(*argv, "-") == 0)
				rval |= fcn(stdin, "stdin");
			else {
				if (!(fp = fopen(*argv, "r"))) {
					warn("%s", *argv);
					rval = 1;
					continue;
				}
				fcn(fp, *argv);
				(void)fclose(fp);
			}
		}
...
}

static void
needpos(size_t n)
{
	static size_t npos;
	size_t oldnpos;

	/* 将位置数组增加到至少指定的大小。 */
	if (n > npos) {
		oldnpos = npos;
		if (npos == 0)
			npos = n;
		while (n > npos)
			npos *= 2;
		if ((positions = (char *)realloc(positions, npos)) == NULL)
			err(1, "realloc");
		memset((char *)positions + oldnpos, 0, npos - oldnpos);
	}
}
...

编译运行

总结

cut命令是一个灵活高效的命令行实用程序,可以在各种文本操作用例中使用。它利用操作从文件或标准输入数据中过滤出文本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值