我希望使用空格作为cut
命令的分隔符。
我可以使用什么语法?
答案 0 :(得分:315)
cut -d ' ' -f 2
其中2是您想要的以空格分隔的字段的字段编号。
答案 1 :(得分:140)
通常,如果使用空格作为分隔符,则需要将多个空格视为一个空格,因为您解析命令的输出,将某些列与空格对齐。 (以及谷歌搜索引导我来到这里)
在这种情况下,单个cut
命令是不够的,您需要使用:
tr -s ' ' | cut -d ' ' -f 2
或
awk '{print $2}'
答案 2 :(得分:33)
你也可以说
cut -d\ -f 2
请注意反斜杠后面有两个空格。
答案 3 :(得分:4)
我just discovered您还可以使用"-d "
:
cut "-d "
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
答案 4 :(得分:3)
scut,一个类似剪切的实用程序(更聪明,但我做得更慢)可以使用任何perl正则表达式作为破坏令牌。打破空白是默认设置,但你也可以打破多字符正则表达式,替代正则表达式等。
scut -f='6 2 8 7' < input.file > output.file
所以上面的命令会破坏空格上的列并按顺序提取(0-based)cols 6 2 8 7。
答案 5 :(得分:3)
如果数据具有多个空格,则无法通过剪切轻松完成。我发现规范化输入以便于处理很有用。一个技巧是使用sed进行标准化,如下所示。
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
答案 6 :(得分:0)
我有一个答案(我承认有些令人困惑的答案)涉及sed
,正则表达式和捕获组:
\S*
- 第一个字\s*
- 分隔符(\S*)
- 第二个字 - 捕获.*
- 其余部分作为sed
表达式,需要对捕获组进行转义,即\(
和\)
。
\1
返回捕获组的副本,即第二个单词。
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta
当你看到这个答案时,它有点令人困惑,你可能会想,为什么要这么麻烦?好吧,我希望有些人可能会去“啊哈!”并将使用此模式通过单个sed
表达式解决一些复杂的文本提取问题。