Ruby awk cmd从标准输出捕获行

Ruby awk cmd从标准输出捕获行,ruby,bash,rubygems,awk,Ruby,Bash,Rubygems,Awk,以下是gem-environment命令的输出 ○ 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

以下是
gem-environment
命令的输出

○ 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 ~
-GEM路径下,捕获
/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global
行的
awk
命令是什么?
/Users/userme/.rbenv/versions/1.9.3-p194/gemsets/global
行之前剥离
-

尝试:

$ gem env gempath
/home/mpapis/.rvm/gems/ruby-1.9.3-p286:/home/mpapis/.rvm/gems/ruby-1.9.3-p286@global
它将显示所有用路径分隔符分隔的路径,该分隔符在linux上为
请尝试:

$ gem env gempath
/home/mpapis/.rvm/gems/ruby-1.9.3-p286:/home/mpapis/.rvm/gems/ruby-1.9.3-p286@global

它将显示所有用路径分隔符分隔的路径,该分隔符是
在linux上使用
awk
,您可以通过以下管道输出:

awk '{if(e){sub (/^ *- */,"",$0);print;e=0}}/GEM PATHS/{e=1}'
其工作原理如下:

  • e
    (echo)标志从0开始,因此将禁用回显
  • 对于设置了回显标志的每一行,它首先删除行开头的
    -
    ,回显修改后的行,然后重置标志
  • 当它找到一个
    GEM路径
    行时,它设置标志,以便使用前面的规则输出下一行
下面是一个小的实录:

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/gemests/global
使用
awk
,您可以通过以下管道输出:

awk '{if(e){sub (/^ *- */,"",$0);print;e=0}}/GEM PATHS/{e=1}'
其工作原理如下:

  • e
    (echo)标志从0开始,因此将禁用回显
  • 对于设置了回显标志的每一行,它首先删除行开头的
    -
    ,回显修改后的行,然后重置标志
  • 当它找到一个
    GEM路径
    行时,它设置标志,以便使用前面的规则输出下一行
下面是一个小的实录:

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/gemests/global
下面是使用
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

下面是使用
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
arg for sub(),因为这是默认值。另外,如果您将对“e”的测试移动到脚本的条件部分,而不是将其包装在脚本的操作部分的if子句中,那么它会更糟糕,即
e{foo}
而不是
{if(e){foo}
。不需要
,默认情况下,$0
arg for sub()。另外,如果您将对“e”的测试移动到脚本的条件部分,而不是将其包装在脚本的操作部分的if子句中,则会更加糟糕,即对于非getline awk解决方案,
e{foo}
而不是
{if(e){foo}
+1,但是请注意,如果您想要的模式位于文件末尾(可能在某些其他情况下),则getline解决方案的行为将不受欢迎。+1对于非getline awk解决方案,但请注意,如果您想要的模式位于文件末尾(可能在某些其他情况下),则getline解决方案的行为将不受欢迎。