удаление нежелательного текста с помощью sed, cut или awk - PullRequest
1 голос
/ 29 января 2020

Моя текущая команда:

cat source.txt*|sort -V -k2 -k3 |egrep "WiFiAdapterAndroid|Lat:"

Вывод команд:

+INFO  2019-12-17 10:10:51,488 [AndroidGPS:-1225032884] Lat: 39.287593; Lon: -94.659815; Speed: 19MPH; Heading: N; Accuracy: 3m; Alt: 281m; SatsUsed: 17; SatsInView: 23.
+INFO  2019-12-17 10:11:20,729 [WiFiAdapterAndroid:-1225032884] netStateChgd: DISCONNECTED
+INFO  2019-12-17 10:11:20,856 [WiFiAdapterAndroid:-1225032884] supStateChgd: COMPLETED->DISCONNECTED
+INFO  2019-12-17 10:11:21,082 [WiFiAdapterAndroid:-1225032884] supStateChgd: DISCONNECTED->SCANNING

Я бы хотел, чтобы список отображался как есть, но чтобы он был таким, чтобы у меня были только действительные значения широты и долготы цифры и никаких других данных в этой строке.

Пример того, что я хочу видеть:

39.287593 -94.659815
+INFO  2019-12-17 10:11:20,729 [WiFiAdapterAndroid:-1225032884] netStateChgd: DISCONNECTED
+INFO  2019-12-17 10:11:20,856 [WiFiAdapterAndroid:-1225032884] supStateChgd: COMPLETED->DISCONNECTED
+INFO  2019-12-17 10:11:21,082 [WiFiAdapterAndroid:-1225032884] supStateChgd: DISCONNECTED->SCANNING

1 Ответ

2 голосов
/ 29 января 2020

Как это?

sort -V -k2 -k3 source.txt* |
awk '/Lat:/ { gsub(/;/, ""); print $6, $8 }
    /WiFiAdapterAndroid/'

Обратите внимание также, как sort может читать список файлов без помощи cat.

cut здесь не подходит, потому что это не может решить, какие строки изменить; это все или ничего. И наоборот, grep не может изменять извлекаемые строки. Таким образом, Awk предоставляет простую и компактную нотацию для выполнения обеих задач.

Вкратце, Awk выполняет сценарий для каждой строки ввода за раз (или, в более широком смысле, для записи; ее легко настроить для работы) на единицах, которые также являются частями линий или наборов смежных линий). Каждый блок сценария состоит из условия и действия; оба они являются необязательными, поэтому действие без условия соответствует всем строкам безоговорочно, а условие без действия по умолчанию печатает ввод, для которого выполняется условие.

В первой строке скрипта есть условие регулярного выражения который выбирает строки, которые соответствуют регулярному выражению Lat:; действие очищает строку простой подстановкой, чтобы удалить любые точки с запятой, а затем печатает шестой и восьмой токены в строке. (Каждая запись разбита на поля; опять же, здесь есть большая гибкость, но по умолчанию каждое поле является токеном без пробелов, отделенным пробелом от смежных токенов.) И, наконец, как вы можете догадаться, второе условие другое регулярное выражение, которое приводит к печати соответствующих входных данных.

...