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