获取行的第一个元素,同时获取特定单词后的另一个元素

时间:2018-02-06 05:57:27

标签: regex linux shell sed

基本上我有一个这种格式的文件:

12:23:36 some text here length 256 some text here
12:24:37 some text here length 23 some text here

由于单词的数量不同,我希望只使用shell命令获取时间戳和长度值。 我知道如何单独执行它们(分别使用awk和grep),但我找不到合适的方法来获取它们。

编辑: 这是我的行的结构,IP已被修改(我从Tcpdump得到这个):

06:30:51.498909 IP 2.2.2.2 > 1.1.1.1: Flags [.], ack 2326465, win 65535, length 0

06:30:51.609162 IP 3.3.3.3 > 4.4.4.4: Flags [.], ack 1654645, win 65535, length 0

虽然长度并不总是最后一个数字,但某些部分可能会有更多文字

3 个答案:

答案 0 :(得分:1)

如果您的文字不包含数字,则可以使用sed并删除所有[a-zA-Z]字符:

sed 's/[A-Za-z]*//g' file
$ cat test
12:23:36 some text here length 256 some text here
12:24:37 some text here length 23 some text here
$ sed 's/[A-Za-z]*//g' test
12:23:36     256
12:24:37     23

另一种解决方案是使用awk打印第一列,使用正则表达式提取数字部分,如this answer中所述。我不是awk专家,但应该是这样的:

gawk -F' [^0-9]* ' 'BEGIN { ORS=" " };{print $1} {print $0=$2"\n"}' file

答案 1 :(得分:1)

使用sed

sed -E 's/^(..:..:..).*length.*([0-9]+).*/\1 \2/' file
  • -E - 使用扩展正则表达式
  • ^(..:..:..)捕获时间戳
  • ([0-9]+)匹配长度
  • \1 \2用匹配的部分替换整行

对于您的文件,它提供此输出:

12:23:36 256
12:24:37 23

答案 2 :(得分:0)

如果时间戳始终位于行的开头,

你可以试试这个sed

sed -E 's/([^. ]*).*length ([^ ]*).*/\1 \2/' infile