• 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);
    	}
    }
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    编译运行

    总结

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

  • 相关阅读:
    我用canvas带你看一场流星雨
    【Nginx】负载均衡、动静分离理论篇
    Django ModelForm中使用钩子函数校验数据
    01_Maven
    zsh和ohmyzsh安装指南+插件推荐
    C语言典范编程
    头歌资源库(12)找第K小数
    基于强化学习的机组组合问题求解方法研究
    文本情感计算技术(深度)
    python调用32位的ControlCan.dll实现can报文的收发
  • 原文地址:https://blog.csdn.net/chen1415886044/article/details/127587743