基本上我有一个具有此格式的文件:
12:23:36 some text here length 256 some text here
12:24:37 some text here length 23 some text here
随着单词数量的变化,我只能使用shell命令获得时间戳和长度值。我知道如何分别(分别使用尴尬和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
长度并不总是最后一个数字,某些部分中可能会有更多文本
使用 sed
:
sed -E 's/^(..:..:..).*length.*([0-9]+).*/1 2/' file
-
-E
-使用扩展的正则表达式 -
^(..:..:..)
捕获时间戳 -
([0-9]+)
匹配长度 -
1 2
用匹配的零件替换整个线
对于您的文件,它给出了此输出:
12:23:36 256
12:24:37 23
如果您的文本不包括数字,则可以使用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
打印第一列,并如本答案所述提取数字部分。我不是awk
专家,但应该是:
gawk -F' [^0-9]* ' 'BEGIN { ORS=" " };{print $1} {print $0=$2"n"}' file
如果时间戳始终处于线路的开头,
您可以尝试此SED
sed -E 's/([^. ]*).*length ([^ ]*).*/1 2/' infile