什么构成了 cut 命令的“字段”?

luc*_*590 17 linux cut

例如,该cut命令可以带一个参数 -f,根据man

仅选择这些字段;还打印任何不包含分隔符的行,除非指定了 -s 选项

在这种情况下,什么是字段?

slm*_*slm 19

术语“字段”通常与诸如cut和 之类的工具相关联awk。如果您获取数据并使用特定字符将其分隔,则字段将类似于一列数据。通常用于执行此操作的字符是Space.

但是,与大多数工具一样,它是可配置的。例如:

  • awk = awk -F"," ...- 将用逗号分隔(即,)。
  • cut = cut -d"," ...- 将用逗号分隔(即,)。

例子

第一个显示了如何awk在空间上自动分割。

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Run Code Online (Sandbox Code Playgroud)

这也显示了如何cut在空间上拆分。

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Run Code Online (Sandbox Code Playgroud)

这里我们有一个列数据的 CSV 列表,我们用它cut来返回第 1 列和第 4 列。

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Run Code Online (Sandbox Code Playgroud)

awk 也可以这样做:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Run Code Online (Sandbox Code Playgroud)

awk 也更擅长处理各种分离字符。在这里它在处理Tabs与一起Spaces,他们是在同一时间,混合间:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Run Code Online (Sandbox Code Playgroud)

-s 切换到 cut 怎么样?

关于这个开关,它只是告诉cut不要打印任何不包含通过-d开关指定的分隔符的行。

例子

假设我们有这个文件。

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.
Run Code Online (Sandbox Code Playgroud)

注意:上面的第二个字符串中有空格和制表符。

现在,当我们使用cut和不使用-sswitch处理这些字符串时:

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,您可以看到-s开关从输出中省略了任何不包含分隔符的字符串,Space.


l0b*_*0b0 8

根据 POSIX 的字段是由 中的任何字符分隔的行的任何部分IFS,“输入字段分隔符(或内部字段分隔符)。 ”的默认值是空格,后跟水平制表符,后跟换行符. 使用 Bash,您可以运行printf '%q\n' "$IFS"以查看其价值。