【现学现忘&Shell编程】— 30.cut列提取命令

【现学现忘&Shell编程】— 30.cut列提取命令,第1张

cut 命令的作用是对文本中的内容进行截取。

一个文件里边有很多数据, grep 命令是用来提取文本内容包含匹配规则的行,而 cut 命令是用来截取文本内容中的列数据。

使用如下文本:

使用 cut 命令提取student.txt文本中的第二列信息

如果只需要第二列信息,且不需要标题,就需要结合前边说的 grep 命令一起使用了。

如果想要提取文本中多列数据,只要将列号直接用 , (逗号)分开即可,命令如下:

cut 命令可以按照字符进行提取,需要注意 8- 代表的是提取所有行的第十个字符开始到行尾,而

10-20 代表提取所有行的第10个字符到第20个字符,而 -8 代表提取所有行从行首到第8个字符。

例如:以 : 作为分隔符,提取 /etc/passwd 文件中,普通用户的第一列和第三列数据信息。

需要先过滤掉伪用户和root用户,在切割提取。

之后我们就可以把这些提取出来的数据,传入变量中,然后该变量就可以在程序中进行 *** 作了。

cut 命令默认分隔符是制表符(tab键),而不是使用空格来进行分隔,因为 cut 命令不识别空格作为分隔符。

如果有特定的符号,也是可以用 -d 选项进行指定做为分隔符。

而空格不推荐作为 cut 命令的分隔符。

如查看磁盘情况的 df 命令:

这个命令中间的分隔就是空格。

如我们通过 cut 命令获取二列信息,如下:

我们看到 cut 命令默认是不识别空格作为分隔符的。

如果我们用 -d 选项指定空格作为分隔符,如下:

可以看到获取的是一列空格,也非常的不好用。

所以不推荐空格作为 cut 命令的分隔符。

cut命令的用法如下:

cut - 在文件的每一行中提取片断

在 每个文件 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

显示 版本信息, 然后 结束

使用 且 只使用 -b, -c 或 -f 中的 一个 选项. LIST 由 一个 范围 (range) 或 逗号 隔开的 多个 范围 组成. 范围 是 下列 形式 之一:

N

第 N 个 字节, 字符 或 字段, 从 1 计数 起

N-

从 第 N 个 字节, 字符 或 字段 直至 行尾

N-M

从 第 N 到 第 M (并包括 第M) 个 字节, 字符 或 字段

-M

从 第 1 到 第 M (并包括 第M) 个 字节, 字符 或 字段

如果 没有 指定 文件 FILE, 或 FILE 是 -, 就从 标准输入 读取 数据.

曾经有一同事问我,在linux下如何输出一个文本文件的第二列,文本内容不限。我不假思索地说用 awk 啊。她追问只有这一种方式么?于是我仔细想了想,……

既然内容不限,则可以自定义文件内容的格式,这样可以用的命令自然会多一些。

需求为输出文件第二列,则基本上有两种方式实现:

因而,任何能直接输出特定列的命令,以及能够截取或删除其它列的命令都满足此需求。

为了方便说明,列举几个示例文件:

awk自然是最容易想到的,它处理格式化的文本得心应手。

使用 -F 指定列(字段)分隔符。

如果文件只有两列,还可以使用 $NF ,如 awk '{print $NF}' test1.txt 。

awk还支持一些函数,同样可以将第二列提取出来,此处不再赘述。

cut命令的默认字段分隔符是 TAB ,可以使用 -d 重新指定。 -f 列出指定字段。

如果第二列的字符的起始和结束序号为固定值,如test2.txt,可以使用 -c 参数,截取特定的字符序列。

sed采用的是第二种实现方式,即将其它列删除掉,利用 后向引用 :

在test1.txt中,第二列的前面和后面分别为数字空格和空格数字,所以可以利用 正则表达式 将其输出出来。

同理:

colrm命令可以删除标准输入中的指定列,但 该命令中所定义的列指的是单个字符 ,这与常规对字段的定义不同,需注意。

格式如下:

如果只指定start,则大于等于start的列均被删除;如果指定了start和stop,则大于等于start,小于等于stop的列被删除。

因此,此命令可处理第二个字段起始位置为固定值的test2.txt文件。

read读取文件中的每行,将特定的列输出来。

shell支持命令替换,通过两次命令替换,得到第二列:

虽然不清楚她从哪里看到的这道题目,题目本身是何用意。但以一个问题,调动起了对linux多个命令及知识点的学习和总结,还是有价值的。

欢迎提出不同解法!

相关命令


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8500991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存