给定格式为的主机名aaa0.bbb.ccc,我想在之前提取第一个子字符串.,也就是说,aaa0在这种情况下.我使用以下awk脚本来执行此操作,
echo aaa0.bbb.ccc | awk '{if (match($0, /\./)) {print substr($0, 0, RSTART - 1)}}'
Run Code Online (Sandbox Code Playgroud)
当在一台机器上运行的脚本A生成时aaa0,在机器上运行B只生成aaa,而0不是最终.两台机器运行Ubuntu/Linaro,但A运行较新版本的awk(版本3.1.8 gawk,而B旧版awk(版本1.2的mawk)
我总体上问,如何编写执行相同功能的兼容awk脚本...
Chr*_*our 56
您只想将字段分隔符设置为.使用该-F选项并打印第一个字段:
$ echo aaa0.bbb.ccc | awk -F'.' '{print $1}'
aaa0
Run Code Online (Sandbox Code Playgroud)
同样的事情,但使用切割:
$ echo aaa0.bbb.ccc | cut -d'.' -f1
aaa0
Run Code Online (Sandbox Code Playgroud)
或者sed:
$ echo aaa0.bbb.ccc | sed 's/[.].*//'
aaa0
Run Code Online (Sandbox Code Playgroud)
甚至grep:
$ echo aaa0.bbb.ccc | grep -o '^[^.]*'
aaa0
Run Code Online (Sandbox Code Playgroud)
我总体上问,如何编写执行相同功能的兼容awk脚本...
在你的问题中解决问题很容易.(查看别人的回答).
如果你想编写一个awk脚本,可以移植到任何awk实现和版本(gawk/nawk/mawk ...),那真的很难,即使用--posix(gawk)
例如:
\x逃避,有些则不支持FS 口译员的工作方式不同以上所有要点都是一般性的.回到你的问题,你的问题只与awk的基本功能有关.awk '{print $x}'这样的线将适用于所有的问题.
你的awk行在gawk和mawk上表现不同的原因有两个:
substr()错误地使用了你的功能.这是主要原因.你substr($0, 0, RSTART - 1)的0应该是1,无论哪个awk的你使用.awk数组,字符串idx等是基于1的.
gawk和mawk的实现方式substr()不同.