iOS环境下无需第三方命令,用sed/grep实现awk '{print $6}'功能
用iOS自带sed/grep实现提取第6列的方案
当然可以!在iOS原生的命令行工具里,完全不需要依赖第三方工具(比如awk、cut),用sed或者grep就能实现和awk '{print $6}'一样的提取第6列的效果。下面针对默认空白符(空格/制表符)分隔的场景,给你几种实用的实现方式:
方法一:用sed直接匹配提取
这是最直接的方式,利用扩展正则精准定位第6列:
sed -E 's/^([^[:space:]]+[[:space:]]+){5}([^[:space:]]+).*/\2/'
原理说明:
-E:启用扩展正则表达式(iOS自带的sed支持这个参数)^([^[:space:]]+[[:space:]]+){5}:匹配开头的前5列内容(每列由「非空白字符+空白分隔符」组成,重复5次)([^[:space:]]+):捕获第6列的内容.*:匹配第6列之后的所有内容- 最后用
\2替换整行,只保留捕获到的第6列
方法二:用sed循环删除前5列
如果觉得正则匹配有点绕,也可以用循环删除的思路:
sed -E ':a s/^[^[:space:]]+[[:space:]]+//; ta; s/[[:space:]]+.*//'
原理说明:
:a:定义一个名为a的循环标签s/^[^[:space:]]+[[:space:]]+//:删除行首的第一列和后面的空白分隔符ta:如果刚才的替换操作成功,就跳回到标签a继续循环,直到删除完前5列s/[[:space:]]+.*//:删除第6列之后的所有内容,只保留第6列本身
方法三:用grep组合实现
虽然iOS的grep不支持Perl正则,但可以通过两次grep组合来提取:
grep -Eo '([^[:space:]]+[[:space:]]+){5}[^[:space:]]+' | grep -Eo '[^[:space:]]+$'
原理说明:
- 第一个
grep -Eo:匹配并输出「前5列+第6列」的完整内容(-o只输出匹配部分) - 第二个
grep -Eo:从上面的结果中提取最后一段非空白字符,也就是我们要的第6列
额外注意:
如果你的列分隔符不是空白符(比如逗号、冒号),只需要把上面正则里的[:space:]替换成对应的分隔符即可。另外,如果某行的列数不足6列,这些命令的行为和awk一致——要么输出空内容,要么不匹配输出,你可以根据实际需求调整正则逻辑。
内容的提问来源于stack exchange,提问作者Jacob Collins
相关产品推荐
相关产品推荐

