如何在bash中使用awk,sed或其他方法提取文件中的特定字符串?

时间:2016-01-05 19:42:52

标签: bash shell awk sed

我有一个包含以下文本的文件(多行具有不同的值):

TokenRange(start_token:8050285221437500528,end_token:8051783269940793406,...

我想提取start_tokenend_token的值。我尝试了awk和cut,但我无法找出提取目标值的最佳方法。

类似的东西:

cat filename| get the values of start_token and end_token

3 个答案:

答案 0 :(得分:3)

grep -oP '(?<=token:)\d+' filename

说明:

  • -o:仅打印匹配的部分,而不是完整的行
  • -P:使用Perl正则表达式引擎(用于环顾)
  • (?<=token:):正面观察 - 零宽度模式
  • \d+:一个或多个数字

结果:

8050285221437500528
8051783269940793406

hek2mgl在其评论中指出的(可能更有效)变体,使用\K,可变宽度的后视:

grep -oP 'token:\K\d+'

\K会保留匹配在其左侧的所有内容,但不会将其包含在匹配项中(请参阅perlre)。

答案 1 :(得分:1)

使用awk

awk -F '[(:,]' '{print $3, $5}' file
8050285221437500528 8051783269940793406

第一个值为start_token,最后一个值为end_token

答案 2 :(得分:0)

一个sed版本

sed -e '/^TokenRange(/!d' -e  's/.*:\([0-9]*\),.*:\([0-9]*\),.*/\1 \2/' YourFile