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