使用 sed 或 cut 或 awk 删除不需要的文本

removing unwanted text using sed or cut or awk

我当前的命令:

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

像这样?

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

另请注意 sort 如何在没有 cat 帮助的情况下读取文件列表。

cut在这里不适合,因为它不能决定修改哪一行;全有或全无。相反 grep 不能修改它提取的字符串。那么,Awk 提供了一种简单而紧凑的符号来完成这两项工作。

简而言之,Awk 一次对每一行输入执行一个脚本(或者更广泛地说,一条记录;很容易将其配置为对作为行的一部分或相邻行的集合的单元进行操作) .每个脚本单元由一个条件和一个动作组成;它们都是可选的,所以没有条件的动作无条件匹配所有行,没有动作的条件默认打印条件匹配的输入。

脚本的第一行有一个正则表达式条件,它选择与正则表达式匹配的行 Lat:;该操作通过简单的替换来清理行以删除任何分号,然后打印行中的第六个和第八个标记。 (每条记录被分成字段;同样,这里有很大的灵活性,但默认情况下,每个字段都是一个非空白标记,相邻标记之间由空格分隔。)最后,正如您可能猜到的那样,第二个条件是另一个正则表达式,它会导致匹配的输入被打印出来。