ruby之基礎語法

ruby語法之哈希 =》至關於python的字典python

ruby語法之數組 =》至關於python的列表linux

舉例:git

gitaly= Hash.new       #創建新Hash類型
gitaly['first']="myfirst"
gitaly['storage'] = [
   {
     'name' => 'default',
     'path' => '/tmp/path-1'
   },
   {
    'name' => 'nfs1',
    'path' => '/mnt/nfs1'
   }
 ]
puts gitaly          #{"first"=>"myfirst", "storage"=>[{"name"=>"default", "path"=>"/tmp/path-1"}, {"name"=>"nfs1", "path"=>"/mnt/nfs1"}]}
puts gitaly.keys     #first   storage
puts gitaly['storage'][0]  #{"name"=>"default", "path"=>"/tmp/path-1"}
puts gitaly['storage'][-1] #{"name"=>"nfs1", "path"=>"/mnt/nfs1"}
puts gitaly.size           # 2


test=[]   #新的空的數組類型
test[0]="a"
test[1]='k'
puts test  # a k

數組的增:
test << "b" #["a","k","b"]
test.push("b") #數組尾部增長元素
test.xshift("b") #頭部增長元素
數組的刪:
test.pop #後面不加元素,依次從尾部刪除一個元素
test.shift #後面不加元素,依次從頭部刪除一個元素
test.delete("a") #刪除元素a ,有多個a都刪除
test.delete_at(2) #刪除某個索引位置的元素
數組的去重:bb=test.uniq #不改變test的值,改變原數組用uniq!
數組變成字符串:kk=["a","b","a"];bb=kk.join("-") # a-b-a 使用某個符合鏈接,能夠是多個字符
將字符串變成數組:kk="abcd";bb=kk.split(//) #【"a","b","c","d"】
數組的排序:kk=["a","b","a"];bb=kk.sort;puts bb # a a b

查看數據的類型shell

aa='aa'
puts aa.class

ruby語法之處理字符串
json

puts aa  aa='hello world' aa['hello']='first' #匹配第一個符合條件的字符串,區別python的字符串
puts aa            #first world
puts aa.class      #string
 aa='hello world' aa[0..4]='first' puts aa #first world
puts aa.class      #string
 aa='hello world hello' aa.gsub('hello','first')  #替換全部符合條件的字符串
puts aa           #hello world hello
puts aa.class     #string
 aa='hello world' aa.insert 5,' my'  #在指定位置插入字符串
puts aa            #hello my world
puts aa.class      #string


kk='abc'
kk<<'def' #用來拼接字符串 puts kk #abcdef


#chomp和chomp!的區別是 chomp!會改變原字符串
aa='hello world!' aa.chop! #刪除最後一個字符,改變了原字符串,使用chop不會改變原來的字符串 puts aa # hello world puts aa.class #string

#刪除尾部指定單個字符或者字符串

  aa="hellohello"
  bb=aa.chomp!("o") #或者 bb=aa.chomp!("llo"),可是裏面若是是he的話,bb就是空值,aa不變vim

  puts aa    #hellohell
  puts bb    #hellohell數組

#刪除開頭第一個字符
str[0]=""
#刪除結尾最後一個字符
str[-1]=""

#使用delete方法刪除指定字符串,deleteh和delete!區別和chomp相似
puts "hello".delete "abcdefghijkl" #o

#tr和tr! 修改爲對應的字符,一個一個比對,沒有則替換成前面一個替換的字母
"hello".tr!("lexyz","pi") #hippo
hello".tr("lho","km") #mekko -> l替換成k h替換成m,o也替換成m
#到這裏發現tr命令很強大啊,那麼能夠用它來刪除了
hellohello".tr("lh","") #eoeo

ruby插件之json將字符串轉化成哈希ruby

#!/usr/bin/ruby

require 'json'
aa="{\"a\":\"1\",\"b\":\"2\"}"  #字符串,json裏面沒有單引號
bb=JSON.parse(aa)               #使用json進行轉化
puts bb.class                   #類型變爲Hash
puts bb["c"]                    #沒有不報錯,可是爲空
puts bb["a"]                    # 1
puts bb                         # {"a"=>"1", "b"=>"2"}

ruby讀入文件 IO.readlinesapp

[root@orl11-infa ~]# cat test1.rb 
#!/usr/bin/ruby

arr=IO.readlines("tt.txt")
puts arr.class puts arr puts
"------------------------" puts arr[0] [root@orl11-infa ~]# vim test1.rb [root@orl11-infa ~]# ruby test1.rb #運行結果 Array #變成數組類型 1 first line 2 second line ------------------------ 1 first line

 ruby之寫入文件curl

#先清空後寫入
#!/usr/bin/ruby
File.open("r2.txt", "w+") do |file|
  file.puts "haha"
  file.puts "heihei"
  file.close()
end

#後面追加
File.open("r2.txt", "a+") do |file|
  file.puts "haha"
  file.puts "heihei"
  file.close()
end

ruby之打印文件的絕對路徑

puts File.expand_path("r2.txt")

 

ruby之修改文件的權限

[root@orl11-infa ~]# cat test1.rb 
#!/usr/bin/ruby
file=File.new("tt.txt","w")
file.chmod(0755)
[root@orl11-infa ~]# ll tt.txt
-rw-r--r-- 1 root root 27 10月 28 16:22 tt.txt
[root@orl11-infa ~]# ruby test1.rb
[root@orl11-infa ~]# ll tt.txt
-rwxr-xr-x 1 root root 0 10月 28 16:27 tt.txt

 ruby語法之判斷if

x=1
if x > 2
   puts "x 大於 2"
elsif x <= 2 and x!=0
   puts "x 是 1"
else
   puts "沒法得知 x 的值"
end
其餘:對當前條件不作處理,使用next

ruby語法之循環

for i in 0..5
   puts "局部變量的值爲 #{i}"
end

ruby語法:循環each

[root@orl11-infa ~]# cat test2.rb 
#!/usr/bin/ruby

aa=['awk','block','cd']
aa.each do |temp|
  if temp.include? 'c'
    puts temp
  end
end

[root@orl11-infa ~]# ruby test2.rb
block
cd

 舉例:根據以前logstash處理季度和search_name的問題如今徹底能夠用ruby語法處理

if "cdpTest" in [tags]{
  grok {
      match => { "message" => "\|%{DATA:userName}\|%{DATA:opreteTimeStamp}\|%{DATA:year}-%{DATA:month}-%{DATA:day} %{DATA:hour}:%{DATA:other}\|%{DATA:deviceModel}\|%{DATA:pageName}\|%{DATA:elementName}\|%{DATA:params}\|%{DATA:appKey}\|%{DATA:ssoSource}\|%{DATA:logType}\|" }
  }
  ruby {
   code => "
   bb=event.get('[month]').to_i
   bb=(bb+2)/3
   cc=(bb.to_s)<<'季度'
   event.set('quarter',cc)
   aa=event.get('[params]')
   require 'json'
   dd=JSON.parse(aa)
   if dd['search_name']
      event.set('search_name',dd['search_name'])
   end
    " 
   remove_field => [ "message" ]      
  }
}
}

 ruby語法之計算昨天的日期

#!/usr/bin/ruby
require 'date'
day=Time.now
puts day.strftime("%Y%m%d")
day1=Date.new(day.year,day.month,day.day)
day1=(day1 - 1).strftime("%Y%m%d")
puts "昨天的日期:#{day1}"
str="hhh_v"<<day1
puts str

[root@orl11-infa ~]# ruby data.rb
20191028
昨天的日期:20191027
hhh_v20191027

 到了這裏,咱們就會想ruby語言和shell的交互

方式一:exec  取代當前進程,不產生子進程,它執行成功後,它後面的命令不會執行
exec "curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt"
方式二:使用反引號 ``,產生子進程,後面的命令能夠執行
`curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt`
方式三:使用system,產生子進程,後面的命令會執行,返回命令執行的結果(true或者false)
cmd=system "curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt"
puts cmd #true
if cmd
puts 'success'
else
puts "failure"
end
方式四:使用%x,後面的命令會執行
%x(for i in `seq 1 5`;do echo $i;done)
%x(echo "hello";echo "haha")

 

其餘:

ruby腳本的後綴 .rb
變量放入""裏面時,puts "#{kk}"字符串轉化成整形:.to_i整形轉化成字符串:.to_s導入模塊:require 'json'ruby腳本的語法檢查:ruby -c 腳本ruby在linux命令行中執行:ruby -e 'aa="abc";if aa.include? "b";puts "ok";else "no";end'對命令取反,使用:!(正常命令),例如知足不包括的條件 !(bb.include? temp)字符串以什麼開頭:str.start_with("a")特殊符號:\t tab鍵  \s 空格  \n換行  \r回車跳出當前循環:next退出整個循環:break在linux的shell中輸入 irb 進入ruby的語言環境,相似於輸入python進入python環境
相關文章
相關標籤/搜索