2012-12-03 40 views
0

以下是gem environment命令的输出。awk cmd从STDOUT捕获行

○ gem environment 
RubyGems Environment: 
    - RUBYGEMS VERSION: 1.8.23 
    - RUBY VERSION: 1.9.3 (2012-04-20 patchlevel 194) [x86_64-darwin10.8.0] 
    - INSTALLATION DIRECTORY: /Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global 
    - RUBY EXECUTABLE: /Users/userme/.rbenv/versions/1.9.3-p194/bin/ruby 
    - EXECUTABLE DIRECTORY: /Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global/bin 
    - RUBYGEMS PLATFORMS: 
    - ruby 
    - x86_64-darwin-10 
    - GEM PATHS: 
    - /Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global 
    - .bundle 
    - GEM CONFIGURATION: 
    - :update_sources => true 
    - :verbose => true 
    - :benchmark => false 
    - :backtrace => false 
    - :bulk_threshold => 1000 
    - :sources => ["http://rubygems.org/"] 
    - "gem" => "--no-rdoc --no-ri" 
    - REMOTE SOURCES: 
    - http://rubygems.org/ 
userme at userme in ~ 

会是什么awk命令捕获- GEM PATHS:线下/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global条带化-之前的/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global线?

回答

2

下面是使用sed方式:

sed -n '/- GEM PATHS:/ { N; s/.* - //p }' file 

而且使用awk另一种方式,如果你熟悉使用getline

awk '/- GEM PATHS:/ { getline; sub(/.* - /,""); print }' file 

否则,这可能是你最安全的赌注:

awk 'n && !--n { sub(/.* - /,""); print } /- GEM PATHS:/ { n = 1 }' file 

结果:

/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global 
+0

+1对于非getline awk解决方案,但请注意,如果所需模式位于文件末尾(可能还有其他一些情况),getline解决方案的行为将会不受欢迎。 –

2

尝试:

$ gem env gempath 
/home/mpapis/.rvm/gems/ruby-1.9.3-p286:/home/mpapis/.rvm/gems/[email protected] 

它会显示所有PATH_SEPARATOR分离的路径是:在Linux上

2

随着awk,可以通过管道输出通过:

awk '{if(e){sub (/^ *- */,"",$0);print;e=0}}/GEM PATHS/{e=1}' 

它的工作原理如下:

  • e(回显)标志从0开始,因此回显被禁用。
  • 对于设置回声标志的每一行,它首先删除行首的<spaces>-<spaces>,回显修改的行,然后重置标志。
  • 如果它找到一条GEM PATHS行,它会设置该标志,以便使用先前的规则输出下一行。

下面是这个动作小的成绩单:

pax> echo 'RubyGems Environment: 
    - RUBYGEMS VERSION: 1.8.23 
    - GEM PATHS: 
    - /Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global 
    - .bundle 
    - GEM CONFIGURATION: 
    - :update_sources => true 
' | awk '{if(e){sub (/^ *- */,"",$0);print;e=0}}/GEM PATHS/{e=1}' 
 
/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global 
+0

无需为'$ 0' ARG的子(),因为这是默认的。此外,如果将测试的“e”移动到脚本的条件部分,而不是将其包装在脚本的动作部分的if子句中,比如'e {foo}'而不是'{如果(E){FOO}}'。 –