Shell字串操作

來源:互聯網
上載者:User

標籤:linux   shell   字串   

1. 字串的長度,例如:
* $ var="get the length of me"
$ echo ${#var}
20
* $ expr length "$var" #注意這裡是雙引號
20
* $ echo $var | awk ‘{printf("%d",length($0))}‘
20
* $ echo -n $var | wc -c # echo每次輸出時,會自動的輸出分行符號,-n表示部署出那一個分行符號
20
 
2. 擷取字串中,某些字元的個數,例如
* $ echo $var | tr -cd g | wc -c
2
$ echo -n $var | sed ‘s/[^g]//g‘ | wc -c
2
$ echo -n $var | sed ‘s/[^gt]//g‘ | wc -c
5
 
3. 統計單詞的個數
* $ echo $var | wc -w
 
4. bash提供的數組資料結構,它是以數字為下標的,和C語言從0開始的下一樣:
* $ var="get length of me"
$ var_arr=($var) #這裡把var字串,以數組的形式存放到var_arr中,預設以空格分割
$ echo ${var_arr[0]} ${var_arr[1]} ${var_arr[2]} ${var_arr[3]} ${var_arr[4]}
get the length of me
$ echo ${var_arr[@]} #@表示整個字串
get the length of me
$ echo ${var_arr[*]} #*表示整個字串
get the length of me
$ echo ${#var_arr[@]}#求得整個字元數組的元素個數
5
$ echo ${#var_arr[0]}#求得某個字串的字元個數
3
$ var_arr[5]="new_element" #直接給數組元素賦值
$ echo ${var_arr[@]}
get the length of me new_element
$ echo ${#var_arr[@]}
6
* $ for i in $var; do echo $i" "; done;
get the length of me
 
5. awk裡面的數組:
* echo $var | awk ‘{printf("%d %s\n",split($0,var_arr," "),var_arr[1])}‘
split把字串按照空格分割,存放到var_arr中,並返回數組的長度,注意,這裡第一個元素的下標不是0,而是1。
* awk把一行按照空格分成若干個域,並用$1,$2,$3...來引用,$0表示整行,NF表示該行域的總數。
* echo $var | awk ‘{split($0,var_arr," ");for(i in var_arr) printf("%s ",var_arr[i]);}‘
這裡的for迴圈中,迴圈變數為下標
* echo $var | awk ‘{split($0,var_arr," ");delete var_arr[1]}‘
刪除第一個數組元素
 
6. 取子串
* $ var="get length of me"
$ echo ${var:0:3}
get
$ echo ${var(-2)} #反方向
me
$ echo `expr substr "$var" 5 3`
the
$ echo $var | awk ‘{printf("%s\n",substr($0,9,6))}‘ #從第九個位置開始選取6個字元
length
* 使用cut取子串
$ echo $var | cut -d " " -f 5
me
* $ echo $var | sed ‘s/ [a-z]*//g‘
get
刪除空格+字母串
$ echo $var | sed ‘s/[a-z]* //g‘
me
刪除字母串+空格
 
7. 匹配求子串
* $ echo ${var%% *} #從最右邊開始,刪除最左邊空格右邊的所有字元
get
* $ echo ${var% *} #從最右邊開始,刪除第一個空格右邊的所有字元
get the length of
* $ echo ${var##* } #從最左邊開始,刪除最右邊空格左邊的所有字元
me
* $ echo ${var#* } #從最左邊開始,刪除第一個空格左邊的所有字元
the length of me
 
8. sed有按行列印的功能,記得用tr把空格換為行號
* $ echo $var | tr " " "\n" | sed -n 5p
me
* $ echo $var | tr " " "\n" | sed -n 1p
get
 
9. tr來取子串
* $ echo $var | tr -d " "
getthelengthofme
* $ echo $var | tr -cd "[a-z]" #僅僅保留字母
getthelengthofme
 
10. head和tail
* $ echo "abcdefghijk" | head -c 4
abcd
* $ echo "abcdefghijk" | tail -c 4
hijk
 
11. 查詢字串
* $ var="get the length of me"
$ expr index "$var" t
3
* $ echo $var | awk ‘{printf("%d\n",match($0,"the"));}‘
5
 
12. 子串替換
* $ var="get the length of me"
$ echo ${var/ /_} #把第一個空格替換成底線
get_the length of me
$ echo ${var// /_} #把所有的空格都替換成底線
get_the_length_of_me
$ echo $var | awk ‘{sub(" ","_",$0);printf("%s\n",$0);}‘
get_the length of me
$ echo $var | awk ‘{gsub(" ","_",$0);printf("%s\n",$0);}‘
get_the_length_of_me
$ echo $var | sed ‘s/ /_/‘
get_the length of me
$ echo $var | tr " " "_"
get_the_length_of_me
$ echo $var | tr "[a-z]" "[A-Z]"
GET THE LENGTH OF ME
 
13. tac 會將文本的內容倒置顯示,正如名字和 cat 相反一樣,
功能和cat也是相反的
 
14. 插入子串
* $ var="get the length of me"
$ echo ${var/ /_ } #在第一個空格前加上_
get_ the length of me
$ echo ${var// /_ } #在所有的空格前都加上_
get_ the_ length_ of_ me
$ echo ${var/ / _}
get _the length of me
$ echo ${var// / _} #在所有的空格之後都加上_
get _the _length _of _me
 
* $ echo $var | sed ‘s/\( \)/\1_/‘ #在第一個空格之後加上_
get _the length of me
$ echo $var | sed ‘s/\( \)/\1_/g‘
get _the _length _of _me
$ echo $var | sed ‘s/\([a-z]*\) \([a-z]*\)/\2 \1/‘ #調換get和the的位置
the get length of me
 
15. 刪除子串
* $ var="get the length of me"
$ echo ${var// /}
getthelengthofme
 
* $ echo $var | awk ‘{gsub(" ","",$0);printf("%s",$0);}‘
getthelengthofme
 
* $ echo $var | sed ‘s/ //g‘
getthelengthofme
 
* $ echo $var | tr -d " "
getthelengthofme
 
16. 子串比較使用test命令
 
17. 子串排序
* $ echo $var | tr " " "\n" | sort #正排序
get
length
me
of
the
$ echo $var | tr " " "\n" | sort -r
the
of
me
length
get
* $ cat data.txt | tr " " "\n" | sort -n
 
18. 進位轉換
* $ echo "ibase=10;obase=16;10" | bc
A
 
19. Regex處理url
* $ url="ftp://anonymous:[email protected]/software/scim-1.4.7.tar.gz"
$ echo $url | grep "ftp://[a-z]*:[a-z]*@[a-z0-9\./-]*" #判斷url的有效性
ftp://anonymous:[email protected]/software/scim-1.4.7.tar.gz
* $ echo "$url" "$(expr index "$url" :)" | awk ‘{printf("%s\n",substr($1,1,$2-1));}‘ #截取協議
ftp
$ echo ${url%%:*}
ftp
* $ echo ${url##*@} | cut -d "/" -f 1 #截取網域名稱
mirror.lzu.edu.cn
$ tmp=${url##*@};echo ${tmp%%/*}
mirror.lzu.edu.cn
* $ tmp=${url##*@};echo ${tmp%/*} #截取路徑
mirror.lzu.edu.cn/software
* $ echo ${url##*/} #截取檔案名稱
scim-1.4.7.tar.gz
* $ echo $url | sed ‘s/.*[0-9].//g‘ #截取檔案類型
tar.gz
 
20. sed 和 awk 匹配檔案中的行
* $ sed -n 7,9p README #列印README7-9行
 
21. 處理格式化的文本
* $ cat /etc/passwd | cut -d ":" -f 1,5 #截取/etc/passwd檔案中的使用者名稱和組
* $ cat /etc/group | cut -d ":" -f 1,3 #截取/etc/group檔案中的組名和組id
 
22. 檔案關聯操作
* $ join -o 1.1,2.1 -t":" -1 4 -2 3 /etc/passwd /etc/group
#join命令用來串連兩個檔案,類似於資料庫中兩個表的串連。-t指定分隔字元,
-1 4 -2 3 指定按照第一個檔案的第四列和第二個檔案的第三列,即組ID進行

串連,-o 1.1 2.1表示僅僅輸出第一個檔案的第一列和第二個檔案的第一列


參考資料

============

Shell編程範例 -- by falcon

Shell字串操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.