Три ответа здесь относятся к nmap
, но я нашел префикс sudo
(, которого нет ни в одном из ответов ), который имеет все значение в мире:
$ nmap -sP 192.168.1.0/24
Starting Nmap 7.01 ( https://nmap.org ) at 2019-07-13 14:55 MDT
Nmap scan report for 192.168.1.65
Host is up (0.00037s latency).
Nmap scan report for 192.168.1.66
Host is up (0.00035s latency).
Nmap scan report for 192.168.1.67
Host is up (0.00028s latency).
Nmap scan report for 192.168.1.68
Host is up (0.00025s latency).
Nmap scan report for 192.168.1.70
Host is up (0.017s latency).
Nmap scan report for 192.168.1.254
Host is up (0.00070s latency).
Nmap done: 256 IP addresses (6 hosts up) scanned in 6.86 seconds
$ sudo nmap -sP 192.168.1.0/24
Starting Nmap 7.01 ( https://nmap.org ) at 2019-07-13 14:56 MDT
Nmap scan report for 192.168.1.65
Host is up (0.00050s latency).
MAC Address: 99:99:99:99:99:A6 (Unknown)
Nmap scan report for 192.168.1.66
Host is up (0.00016s latency).
MAC Address: 99:99:99:99:99:D9 (Sony)
Nmap scan report for 192.168.1.70
Host is up (-0.087s latency).
MAC Address: 99:99:99:99:99:36 (Unknown)
Nmap scan report for 192.168.1.254
Host is up (0.0020s latency).
MAC Address: 99:99:99:99:99:00 (Actiontec Electronics)
Nmap scan report for 192.168.1.67
Host is up.
Nmap scan report for 192.168.1.68
Host is up.
Nmap done: 256 IP addresses (6 hosts up) scanned in 2.41 seconds
Я наткнулся на этот вопрос и ответ, потому что я исследую проект по отображению на устройствах удобочитаемых имен, а не IP-адресов и MAC-адресов, закодированных компьютером.
В частности, я хочу, чтобы "Toshiba 43" 4K TV" отображалось, а не "(неизвестно )" для MAC99:99:99:99:99:36
(ненастоящего адреса )выше.
Позже я хочу расширить проект за пределы локальной сети в Интернет, где «Stack Exchange » будет отображаться вместо 999.999.9.99
или «Ask Ubuntu » будет отображаться вместо 999.999.9.99
когда я просматриваю внешние IP-адреса, с которыми взаимодействует моя машина.
ОП не сказал, что проблема требует чего-то другого, кроме как разделить файл пополам, исправить каждую половину и снова соединить вместе, но мне было интересно, как это можно сделать без этих знаний.
И мне очень нравится csvkit и особенно GoCSV для декларативной конвейерной обработки.
Первым шагом является преобразование данных примера фиксированной -ширины в CSV. csvkit позволяет указать схему ширины столбца -...
схема.csv
column,start,length
Time,0,4
Flag,7,13
, а затем конвертировать в CSV:
in2csv -s schema.csv input.txt > input.csv
Я хочу разделить ввод по флагам категории :и времени. А затем для каждой категории создайте набор из одной -строки CSV (для переноса на следующем шаге):
gocsv filter -c 2 --regex "^[01]$" input.csv |
gocsv split --max-rows 1 --filename-base flags
и для дополнительных таймингов используйте тот же шаблон с--exclude
:
gocsv filter -c 2 --regex "^[01]$" --exclude input.csv |
gocsv split --max-rows 1 --filename-base times
Это создает набор файлов, например:
ls flags-*.csv
flags-1.csv flags-2.csv flags-3.csv flags-4.csv
и каждый выглядит примерно так:
флаги -1.csv
Time,Flag
1.00,0
или:
раз -4.csv
Time,Flag
0.57,1.140746e+00
Заголовок Time,Flag
не очень важен, но важно убедиться, что он есть и повлияет на структуру после транспонирования.
Для каждого из этих файлов повторите :транспонирование, выбрав второй столбец (, поскольку фиктивный заголовок становится первым столбцом ), и закройте -ping с соответствующим заголовком:
for FILE in flags-*; do
gocsv transpose $FILE |
gocsv select -c 2 |
gocsv cap --names Flag \
> trans_$FILE;
done
for FILE in times-*; do
gocsv transpose $FILE |
gocsv select -c 2 |
gocsv cap --names Time \
> trans_$FILE;
done
Сложите флаги и время в отдельные столбцы:
gocsv stack trans_flags* > col_flag.csv
gocsv stack trans_times* > col_time.csv
А затем заархивируйте вместе (, и я просто собирался использовать csvlook для более красивой таблицы Markdown, но она также нормализовала числа!):
gocsv zip col_time.csv col_flag.csv > output.csv
csvlook output.csv
Время | Флаг |
---|---|
0,650… | 1 |
0,589… | 0 |
0,560… | 0 |
0,585… | 0 |
0,580… | 1 |
0,528… | 1 |
0,570… | 0 |
1,141… | 0 |
это мило.
Но вот последний шаг с использованием встроенных в GoCSV -в (и новых -в -меня )шаблонов SPRIG и функции round
для очистки чисел с плавающей запятой, целых чисел и научной нотации. Я добавляю новые столбцы на основе оригиналов, затем выбираю только новые/отформатированные столбцы:
cat output.csv |
gocsv add -n Time -t "{{round.Time 2}}" |
gocsv add -n Flag -t "{{round.Flag 0}}" |
gocsv select -c 3- |
gocsv tsv
и получаем:
Time Flag
0.65 1
0.59 0
0.56 0
0.58 0
0.58 1
0.53 1
0.57 0
1.14 0
$ awk 'NR > 1 { d[++n] = $1; d[++n] = $2 } END { print "Time", "Flag"; for (i = 1; 2*i <= n; ++i) printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS }' file
Time Flag
0.65 1
0.59 0
0.56 0
0.58 0
0.58 1
0.53 1
0.57 0
1.14 0
Код awk
считывает все данные по строке -в последовательные элементы в массиве d
(, пропуская заголовок ).
В блоке END
печатается заголовок, затем мы итерируем с i
от 1 до половины длины нашего массива d
, печатая значение по индексу i
(, значение времени )и вn/2 + i
(значение флага ). Форматирование вывода выполняется таким образом, что значение времени печатается как значение с плавающей запятой с двумя десятичными знаками, а значение флага печатается как целое число.
Переменные OFS
и ORS
содержат поле вывода по умолчанию и разделители записей (пробел и новую строку по умолчанию ). Для вывода с разделителями табуляции -используйте awk -v OFS='\t' '{... }' file
.
Для справки: код awk
как свободный -постоянный скрипт:
#!/usr/bin/awk -f
NR > 1 {
d[++n] = $1
d[++n] = $2
}
END {
print "Time", "Flag"
for (i = 1; 2*i <= n; ++i)
printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS
}