#postgresql #awk
#postgresql #авк #awk
Вопрос:
Я хочу проанализировать эти столбцы в таблице psql, но как я могу обрабатывать пустые поля? с помощью этой команды: » awk ‘{print $ 3;}’ text.txt » он игнорирует пробелы и записывает номер следующего столбца..
StartTime LastTime SrcAddr DstAddr Sport Dport SrcPkts DstPkts SrcBytes DstBytes
13:14:52.088291 13:14:52.088291 192.168.0.23 192.168.0.255 57621 57621 1 0 86 0
13:14:54.936682 13:14:54.936682 192.168.0.23 192.168.0.255 17500 17500 1 0 243 0
13:14:54.936479 13:14:54.936479 192.168.0.23 17500 17500 1 0 243 0
13:14:56.056179 13:14:56.056179 192.168.0.163 17500 17500 1 0 208 0
13:14:56.056370 13:14:56.056370 192.168.0.163 192.168.0.255 17500 17500 1 0 208 0
13:15:00.027462 13:15:00.027462 192.168.0.170 192.168.0.255 17500 17500 1 0 146 0
13:15:00.652690 13:15:00.652874 192.168.0.166 443 57201 1 1 121 66
13:15:04.636177 13:15:04.636177 192.168.0.163 192.168.0.255 57621 57621 1 0 86 0
13:15:09.622847 13:15:09.622847 192.168.0.166 38029 53 1 0 76 0
13:15:13.138197 13:15:13.138197 192.168.0.158 192.168.0.255 57621 57621 1 0 86 0
13:15:15.429763 13:15:15.429763 192.168.0.151 192.168.0.255 57621 57621 1 0 86 0
13:15:19.793651 13:15:19.793651 192.168.0.163 192.168.0.255 138 138 1 0 280 0
13:15:19.795815 13:15:19.795815 192.168.0.90 192.168.0.255 137 137 1 0 92 0
13:15:20.342669 13:15:20.342669 192.168.0.23 192.168.0.255 137 137 1 0 92 0
13:14:40.721537 13:14:42.016881 192.168.0.136 192.168.0.166 22 59301 11 14 1334 1404
13:15:24.981466 13:15:24.981466 192.168.0.23 255.255.255.255 17500 17500 1 0 243 0
13:15:24.981666 13:15:24.981666 192.168.0.23 192.168.0.255 17500 17500 1 0 243 0
13:14:40.996353 13:14:41.996328 192.168.0.22 2 0 120 0
13:14:41.203309 13:15:41.171881 66 66 31 0 1984 0
13:15:26.116537 13:15:26.116537 192.168.0.163 17500 17500 1 0 208 0
13:15:26.116728 13:15:26.116728 192.168.0.163 192.168.0.255 17500 17500 1 0 208 0
13:14:41.863153 13:15:41.852795 0 0 31 0 1860 0
13:15:01.195960 13:15:03.192229 192.168.0.234 3 0 180 0
13:15:04.636774 13:15:04.636774 192.168.0.91 192.168.0.163 1 0 60 0
13:15:10.398423 13:15:10.398423 192.168.0.110 192.168.0.1 1 0 60 0
13:15:40.800831 13:15:40.913802 192.168.0.152 192.168.0.1 49556 53 2 2 148 689
Комментарии:
1. Возможно ли, что вы можете создать или получить данные в другом формате, разделенные запятыми или табуляцией, например, что сделало бы явными отсутствующие поля?
2. Ваши данные разделены табуляцией или поля фиксированной ширины или что-то еще? Обновите свой вопрос, чтобы указать, как разделены поля.
Ответ №1:
Вы можете указать по позиции, где получать данные, обрезать их и распечатать с помощью awk
awk '{a=substr($0,40,17);gsub(/ */,"",a);print a}' file
SrcAddr
192.168.0.23
192.168.0.23
192.168.0.23
192.168.0.163
192.168.0.170
192.168.0.163
192.168.0.166
192.168.0.158
192.168.0.151
192.168.0.163
192.168.0.90
192.168.0.23
192.168.0.136
192.168.0.23
192.168.0.23
192.168.0.163
192.168.0.163
192.168.0.91
192.168.0.110
192.168.0.152
Комментарии:
1. Именно то, что я собирался предложить.
Ответ №2:
ПОХОЖЕ, у вас поля фиксированной ширины, поэтому используйте GNU awk:
$ cat file
abcd ef ghi klmno
1234 12 123
$ awk -v FIELDWIDTHS="4 1 2 1 3 1 5" '{print "<" $3 ">"}' file
<ef>
<12>
$ awk -v FIELDWIDTHS="4 1 2 1 3 1 5" '{print "<" $5 ">"}' file
<ghi>
< >
и если вы хотите удалить начальные и конечные пробелы из каждого поля для вывода, просто добавьте gsub():
$ awk -v FIELDWIDTHS="4 1 2 1 3 1 5" '{gsub(/^s |s $/,"",$5); print "<" $5 ">"}' file
<ghi>
<>
$ awk -v FIELDWIDTHS="4 1 2 1 3 1 5" '{print "<" $7 ">"}' file
<klmno>
< 123 >
$ awk -v FIELDWIDTHS="4 1 2 1 3 1 5" '{gsub(/^s |s $/,"",$7); print "<" $7 ">"}' file
<klmno>
<123>