我想知道是否可以使用sed
or grep
(但没有-P
标志)来提供与awk '{print $6}'
.
我正在为 iOS 制作一个脚本,但我不想安装任何第 3 方命令(如awk
)。
- iOS 上的
grep
也不支持该-P
标志,因此不支持perl-regexp
. cut
是 iOS 上的第 3 方命令(所以没有cut
)
答案1
如果你有一个字符串多变的在脚本中,您想提取最后一个字段(正如您在问题标题中所说),那么您可以这样做
field=${string##* }
这假设字符串 in$string
是空格分隔的(将上述变量替换中的空格更改为您使用的任何分隔符)。变量替换会从中删除与给定匹配的${variable##pattern}
最长前缀字符串。$variable
pattern
对于sed
文件,以下内容将提取每行的最后一个空格分隔的字段:
sed 's/^.*[[:space:]]//' data.in
它通过删除每行上直到并包括最后一个空白字符的所有内容来实现此目的。[[:space:]]
如果您的数据不使用制表符或空格作为分隔符,请更改为与最后一列之前的分隔符匹配的正则表达式。
答案2
使用grep
,假设-o
选项可用(另外,按需要最后一列的标题,而不仅仅是特定列)
$ echo 'foo bar 123' | grep -o '[^ ]*$'
123
$ echo 'foo;bar;123' | grep -o '[^;]*$'
123
答案3
要获取符合 POSIX 标准的最后一个空白分隔列sed
(相当于awk '{print $NF}'
)并假设输入是有效文本:
sed 's/[[:blank:]]*$//; # remove trailing blanks
s/.*[[:blank:]]//; # remove every thing up to the last blank
' < file
请注意,大多数awk
实现在空格(水平间距)上分隔字段,但有些(即 busybox awk
)在所有空格 ( [[:space:]]
) 上分隔,而有些则仅在 ASCII 空格(空格和制表符)上分隔,无论区域设置如何。对于来自 Microsoft 操作系统的文件,您可能需要替换[[:blank:]]
为[[:space:]]
,以便它将结尾的 CR 字符视为空格并丢弃它。
要获取第六个字段(相当于awk '{print $6}'
):
s='[[:blank:]]' S='[^[:blank:]]'
sed "s/^$s*\($S\{1,\}$s\{1,\}\)\{5\}\($S\{1,\}\).*/\2/; t
s/.*//; # flush the line if does not have 6 fields"
您还可以使用如下方法:
sed 's/[^[:blank:]]\{1,\}/\
&\
/6; s/.*\n\(.*\)\n.*/\1/;t
s/.*//'
答案4
我用空格分隔符测试了以下情况,使用 sed 命令打印最后一列,效果很好
input.txt
praveen ajay abhi
方法1
echo "praveen ajay abhi"| sed -r "s/.* //g"
输出
阿比