我有这一样一个文件,有个需求,提取指定内容,如,想提取 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
.....
// 多组这样的内容
1
CallMeReznov 2019 年 4 月 2 日
|
2
j0hnj 2019 年 4 月 2 日
python3 -c "import configparser; config = configparser.ConfigParser(); config.read('hosts.txt'); print(config['red'])"
|
3
jasonyang9 2019 年 4 月 2 日
搜索关键字:linux ini style config parser
|
5
pudgedoor 2019 年 4 月 2 日 via Android
Awk 了解一下
|
6
OscarUsingChen 2019 年 4 月 2 日
shell? 那意思不能用 awk,不能用 grep,不能用 python?
|
7
css3 OP @OscarUsingChen 可以啊
|
8
taolu 2019 年 4 月 2 日
sed -n '/red/,/yellow/p' | sed -e 's/\[red\]//' -e 's/\[yellow\]//' -e '/^$/d'
|
9
d0m2o08 2019 年 4 月 2 日
[root@rac1 tmp]# cat 123
[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 [root@rac1 tmp]# sed -n '/\[red\]/,/^$/p' 123 [red] 192.168.1.14 192.168.1.231 192.168.14.27 [root@rac1 tmp]# |
10
taolu 2019 年 4 月 2 日
sed -n '/red/,/^$/p' | sed -e 's/\[red\]//' -e '/^$/d'
修改了下 |
12
OscarUsingChen 2019 年 4 月 2 日
^纯 bash,基本没有依赖。
|
15
DiamondbacK 2019 年 4 月 2 日
不知道哪个是你想要的:
sed -n '/^\[red\]$/,/^ *$/p' # 假定每组有空行分隔 sed -n '/^\[red\]$/,/^ *$/{/^[^[]/p}' sed -n '/^\[red\]$/{:a;/^ *$/!{n;p;ba;}}' |
16
aver4vex 2019 年 4 月 2 日
按行读数据。碰到 [red] 之后就提取下方数据,直到碰到[开头的为止。没啥难度。
|
17
sunnyadamm 2019 年 4 月 2 日 via Android
sed,awk 都可以,具体用法自己查
|
18
sunnyadamm 2019 年 4 月 2 日 via Android
再看一下,如果 IP 都是 192.168 开头,你 grep 也可以啊。。。
|
19
lululau 2019 年 4 月 2 日
既然 sed / (g)awk 都算 shell,那么这个算吗
ruby -ne 'print if /^\[red\]$/../^$/' |
21
CallMeReznov 2019 年 4 月 2 日
@css3 #4
楼主,shell 不熟,但是按照 @j0hnj #2 给的 python 代码实际是可以解决你的问题的 至于为什么没启用是少了个选项而已. 代码如下 https://gist.github.com/CallMeReznov/dd4f93bc36d72da8716a819fa0d4d59d 我在 WINDOWS 上的 py3 上测试成功了 ![]() |
22
ps1aniuge 2019 年 4 月 3 日
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" ``` |
23
zbinlin 2019 年 4 月 3 日
awk -v selected=red '
/^\s*\[.+\]\s*$/ { split($0, keys, /\[|\]/); curr_key = keys[2]; next } selected == curr_key && $0 != "" { print $0 }' hosts.txt |
24
j0hnj 2019 年 4 月 3 日
@CallMeReznov #21 看这个输出应该是报错了吧,这个代码我随手写的,没有测试过。楼主的文件并不是合法的 ini 文件,所以并不能用 configparser 去解析。所以我比较好奇为啥楼主运行没报错,而是输出 <Section: red> …
|
25
no1xsyzy 2019 年 4 月 3 日
awk 'BEGIN{K=0} K==1&&/^\d.+/{print $0} /^\[.+\]$/{K=0} /^\[red\]$/{K=1}'
能够对 [red] 块多次出现的情况应对。 |