我有一个文本文件,我想从中提取一些行和短语。我还想在某些地方插入几个字符。这是一个我打算在一天中定期下载的文件,其中某些值在一天中不断变化:该文件是对天气状况的简单描述,提供当前时间、温度、湿度等信息。文件中的大部分文本都不感兴趣,我正在尝试找到一种方法来从中获取我感兴趣的文本。我使用curl 获取文件,我想通过一些命令通过管道传输它(s) 将仅提取所需的部分并插入提到的字符。
我抓取的文本文件的内容看起来很像这样:
Smyrna, Smyrna Airport, TN, United States (KMQY) 36-00-32N 086-31-12W
Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC
Visibility: 10 mile(s):0
Sky conditions: partly cloudy
Temperature: 86 F (30 C)
Heat index: 93.4 F (34.1 C):1
Dew Point: 73 F (23 C)
Relative Humidity: 66%
Pressure (altimeter): 30.01 in. Hg (1016 hPa)
ob: KMQY 091456Z 18006 10SM SCT035 30/23 A3001
cycle: 15
在这些行中,只有 2、4、5 和 8 行包含感兴趣的文本——其他行可以被丢弃。此外,目标行中的很多内容也不需要。应该指出的是,该文件的内容有些不稳定,时间、温度和湿度等变量会定期变化。我希望在去除不需要的材料后,成品看起来如下:
'Aug 09, 2016 - 10:56 AM EDT\nconditions: partly cloudy\n86 F\nHumidity: 66%'
请注意插入的字符 - \ n 和 '(开头和结尾处的引号) - 需要插入的字符以指示换行符,并且要将整行(包括空格)包含到要执行的程序中。我将提供此输出(imagemagick)。最好,我希望能够将curl的输出通过管道传输到某个命令或一系列命令,这些命令将提取目标材料,插入引号和\n序列,然后将其写入文件。所以,像
curl http://my.weat.her/local.txt | command(s) > currentcond.txt
有人对完成这项任务有建议吗?
答案1
如果命令的输出稳定且一致,那么我们可以根据行号curl
构建一组非常非常基本的命令sed
例如
2s! /.*!!
将采取第 2 行并删除之后的所有内容,/
因此转换
Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC
进入
Aug 09, 2016 - 10:56 AM EDT
我们可以添加\\n
到替换中。
然后使用-n
选项使其sed
仅打印具有p
替换内容的行
所以我们最终得到:
sed -n -e '2s! /.*!\\n!p' \
-e '4s/Sky \(.*\)/\1\\n/p' \
-e '5s/.*: \([0-9]* F\).*/\1\\n/p' \
-e '8s/Relative //p'
最后,我们需要删除换行符,tr -d '\012'
为简单起见,我们将其全部放在一行上:
sed -n -e '2s! /.*!\\n!p' -e '4s/Sky \(.*\)/\1\\n/p' -e '5s/.*: \([0-9]* F\).*/\1\\n/p' -e '8s/Relative //p' | tr -d '\012'
这个解决方案是脆弱的如果输入可能有所不同,但很容易理解。
因此,让我们看一些不太脆弱的东西,并尝试根据图案检测线条。
awk '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }
/^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
/^Temperature: / { t=$2 }
/Relative Humidity: / { h=$3 }
END { print d"\\n"s"\\n"t" F\\nHumidity: "h }
'
在这里,行的顺序并不那么重要,只要它们与模式匹配即可;日期必须以 UTC 等结尾
根据更新的问题进行编辑。
在里面放入引号awk
有时会很痛苦,因此我们可以作弊并预先将其分配给变量(q
在本例中),然后直接在最终print
语句中使用它
awk -vq=\' '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }
/^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
/^Temperature: / { t=$2 }
/Relative Humidity: / { h=$3 }
END { print q""d"\\n"s"\\n"t" F\\nHumidity: "h""q }
'