shell 如何提取文件中的指定内容

2019-04-02 11:52:25 +08:00
 css3

我有这一样一个文件,有个需求,提取指定内容,如,想提取 red 这一组的 ip 出来,应该怎么用 shell 实现啊 :

// hosts.txt
[green]
192.168.1.1

[bule]
192.168.1.123
192.168.1.156

[red]
192.168.1.14
192.168.1.231
192.168.14.27

[yellow]
192.168.2.55
192.168.13.23

.....
// 多组这样的内容

5682 次点击
所在节点    程序员
25 条回复
CallMeReznov
2019-04-02 20:30:35 +08:00
@css3 #4
楼主,shell 不熟,但是按照
@j0hnj #2 给的 python 代码实际是可以解决你的问题的
至于为什么没启用是少了个选项而已.
代码如下
https://gist.github.com/CallMeReznov/dd4f93bc36d72da8716a819fa0d4d59d
我在 WINDOWS 上的 py3 上测试成功了
ps1aniuge
2019-04-03 00:03:03 +08:00
win,linux,通用的 powershell 代码,测试通过。

```
$a = Get-Content -LiteralPath 'a:\pscode\TEMP_2019\temp141\aaa.txt' -raw
[string[]]$b = '[red]'
$c = '['

$a.
split($b,'none')[1].
split($c)[0] -split "`n"
```
zbinlin
2019-04-03 01:26:53 +08:00
awk -v selected=red '
/^\s*\[.+\]\s*$/ {
split($0, keys, /\[|\]/);
curr_key = keys[2];
next
}

selected == curr_key && $0 != "" {
print $0
}' hosts.txt
j0hnj
2019-04-03 12:41:20 +08:00
@CallMeReznov #21 看这个输出应该是报错了吧,这个代码我随手写的,没有测试过。楼主的文件并不是合法的 ini 文件,所以并不能用 configparser 去解析。所以我比较好奇为啥楼主运行没报错,而是输出 <Section: red> …
no1xsyzy
2019-04-03 13:48:23 +08:00
awk 'BEGIN{K=0} K==1&&/^\d.+/{print $0} /^\[.+\]$/{K=0} /^\[red\]$/{K=1}'
能够对 [red] 块多次出现的情况应对。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/551185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX