使用索引和子串的awk

时间:2014-08-25 19:11:07

标签: linux bash shell awk

我有一个命令来剪切字符串。

我想知道Linux中的命令控制索引的详细信息" awk"

我有两种不同的情况。

我想得到消息"测试"在下面的示例字符串中。

1. "Test-01-02-03"    
2. "01-02-03-Test-Ref1-Ref2

第一个我可以得到像

substr('Test-01-02-03',0,index('Test-01-02-03',"-"))
-> Then it will bring result only "test"

第二种情况怎么样我不知道在这种情况下如何使用索引函数获得测试。

您对使用awk有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这是使用index()查找/打印子字符串的方法:

$ cat file
Test-01-02-03
01-02-03-Test-Ref1-Ref2

$ awk -v tgt="Test" 's=index($0,tgt){print substr($0,s,length(tgt))}' file
Test
Test

但对于您的实际问题而言,这可能不是最佳解决方案。

为了便于比较,如何使用match()来表示RE:

$ awk -v tgt="Test" 'match($0,tgt){print substr($0,RSTART,RLENGTH)}' file
Test
Test

如果您喜欢match()概要,请按照以下步骤编写自己的函数来为字符串执行此操作:

awk -v tgt="Test" '
function strmatch(source,target) {
    SSTART  = index(source,target)
    SLENGTH = length(target)
    return SSTART
}

strmatch($0,tgt){print substr($0,SSTART,SLENGTH)}
' file

答案 1 :(得分:1)

如果这些行是awk的直接输入,那么以下工作:

  • echo 'Test-01-02-03' | awk -F- '{print $1}' #First field
  • echo '01-02-03-Test-Ref1-Ref2' | awk -F- '{print $NF-2}'#最后的第三个字段。

如果在awk脚本中将这些行拉出更大的行并需要再次拆分,则以下代码段将执行此操作:

  • str="Test-01-02-03"; split(str, a, /-/); print a[1]
  • str="01-02-03-Test-Ref1-Ref2"; numfields=split(str, a, /-/); print a[numfields-2]