基本上我有一个这种格式的文件:
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
虽然长度并不总是最后一个数字,但某些部分可能会有更多文字
答案 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