假设我运行命令 SayStuff
$ SayStuff
输出为
Watermelons and cucumbers
cucumbers
现在。假设我想从输出中提取子字符串并将其导入到某个对象中。
我以编程方式执行此操作的方法是使用分隔符将输出拆分为数组空间并通过 引用它ArrayName[2]
。我对 shell 脚本还很陌生,只能挖掘出一些半神秘的cut
例子,但都没有任何意义。
有任何想法吗?
答案1
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
告诉按空格分割。-d ' '
选择第三列。cut
-f 3
您还可以使用awk
,它已经根据空间进行拆分,并使列可用作$1
、、$2
...
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
答案2
我可能会使用@slhck 已经给出的选项之一,但这里还有其他几种方法可以做到这一点:
像使用其他语言一样使用数组:
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers
声明
var=()
一个数组,$(command)
保存命令的输出。因此,foo=( $(SayStuff) )
将的输出存储SayStuff
到数组中foo
,然后将echo
它的第三个元素存储为${foo[2]}
。sed
$ SayStuff | sed 's/.* \(.*\)/\1/' cucumbers
该
sed
命令将s///
用最后一个单词替换( )所有内容。正则表达式将匹配空格之前的所有内容(.*
),它将匹配最后一个空格之前的所有内容,然后捕获最后一个单词(\(.*\)
。由于该单词已被捕获,我们可以将其称为\1
。更简单的版本:
$ SayStuff | sed 's/.* //' cucumbers
狂欢
$ foo=$(SayStuff); echo ${foo##* } cucumbers
这使用了 bash 的字符串操作功能,请参阅这里更多细节。
更多 bash
$ SayStuff | while read a b c; do echo $c; done cucumbers
Perl,当然,有很多方法可以做到这一点:
$ SayStuff | perl -lane 'print $F[$#F]' cucumber
使
-a
的perl
行为类似于awk
,在空白处拆分行并保存到数组 中@F
。然后我们打印 的最后一个元素@F
($#F
是 中的元素数@F
)。告诉 perl 在每个语句-l
中添加一个换行符,它应该逐行处理 STDIN,并且它应该运行在命令行中给出的脚本。print
-n
-e
$ SayStuff | perl -pe 's/.* //' cucumber
选项上面已经解释过了,我们只是删除直到最后一个空格的所有内容并打印(
-p
)。$ perl -le 'print $ARGV[$#ARGV]' $(SayStuff) cucumbers
在这里我们将其
Watermelons and cucumbers
作为参数传递,perl 将其保存在@ARG
数组中,因此我们打印最后一个元素@ARG
。诡计。此诡计用于
sed
将空格转换为换行符,然后tail
仅打印最后一行。$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers
grep 和正则表达式,使用
-o
它仅打印匹配的字符串。$ SayStuff | grep -Po '\w+$' cucumbers
作弊
$ SayStuff | grep -o cucumbers cucumbers
答案3
以下是更多解释:
Usage: cut OPTION... [FILE]...
Print selected parts of lines from each FILE to standard output.
-d, --delimiter=DELIM
use DELIM instead of TAB for field delimiter
-f, --fields=LIST
select only these fields; also print any line that contains no
delimiter character, unless the -s option is specified
因此,如果您需要第三个字段,并且它由空格“ ”分隔,那么它就是
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
如果你想要最后的您可能应该使用的字段awk。
在这种情况下,它变成:
$ echo "西瓜和黄瓜" | awk '{ print $NF }'
黄瓜
在awk
NF 中,是行中的字段数,因此$NF
表示行中的最后一个字段。