2012-12-03 36 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}}'。 –