1. 程式人生 > >Linux--shell中字串的擷取

Linux--shell中字串的擷取

1.在linux中字串的擷取我們可以用一個命令叫做cut,cut主要擷取方法有三種

1)位元組(bytes),用選項-b ,使用方法cut -b/c/f 
2)字元(characters),用選項-c 
3)域(fields),用選項-f

2.以位元組定位

1)當我們想獲取某一位元組時

-b後面可以設定要提取哪一個位元組,其實-b和3之間沒有空格也是可以的,但推薦有空格:) 

2)如果“位元組”定位中,我想提取第3,第4、第5和第7個位元組,怎麼破?


-b支援形如3-5的寫法,而且多個定位之間用逗號隔開就ok了。但有一點要注意,cut命令如果使用了-b選項,那麼執行此命令時,cut會先把-b後面所有的定位進行從小到大排序,然後再提取。可不能顛倒定位的順序哦。 
3)其他還有什麼情況呢?



-3表示從第一個位元組到第三個位元組,而3-表示從第三個位元組到行尾。如果你細心,你可以看到這兩種情況下,都包括了第三個位元組“c”。 


如果我執行ls|cut -b -3,3-,你覺得會如何呢?答案是輸出整行。 


4)接下來再看個例子


當我們以-b形式輸出漢字形式的檔案時,顯示亂碼了這是怎麼回事?而-b只會傻傻的以位元組(8位二進位制位)來計算,輸出就是亂碼。 
當遇到多位元組字元時,可以使用-n選項,-n用於告訴cut不要將多位元組字元拆開。例子如下:


4. 域是怎麼回事呢?

為什麼會有“域”的提取呢,因為剛才提到的-b和-c只能在固定格式的文件中提取資訊,而對於非固定格式的資訊則束手無策。這時候“域”就派上用場了。 
(下面的講解內容是在假設你對/etc/passwd檔案的內容和組織形式比較瞭解的情況下進行的。) 
如果你觀察過/etc/passwd檔案,你會發現,它並不像who的輸出資訊那樣具有固定格式,而是比較零散的排放。但是,冒號在這個檔案的每一行中都起到了非常重要的作用,冒號用來隔開每一個項。 
我們很幸運,cut命令提供了這樣的提取方式,具體的說就是設定“間隔符”,再設定“提取第幾個域”,就OK了! 
以/etc/passwd的前五行內容為例:


用-d來設定間隔符為冒號,然後用-f來設定我要取的是第一個域,再按回車,所有的使用者名稱就都列出來了。 
在設定-f時,也可以使用例如3-5或者4-類似的格式:


5.如果遇到空格和製表符時,怎麼分辨??

有時候製表符確實很難辨認,有一個方法可以看出一段空格到底是由若干個空格組成的還是由一個製表符組成的。


看到了吧,如果是製表符(TAB),那麼會顯示為\t符號,如果是空格,就會原樣顯示。 
通過此方法即可以判斷製表符和空格了。

5.我想將ps和cut命令配合使用時,怎麼總是在最後兩行出現重複現象?

這個問題的具體描述是如下這樣的。 
當cut和ps配合時:


我們可以看到有兩個5,為什麼呢? 
其實這個問題是這樣的,ps|cut會自身建立一個程序,所以當ps時也會提取出這個程序,然後通過管道輸出到cut,所以cut擷取後,就多出了一行,之所以會重複上一行內容,是由於我們恰巧取到了和上一行內容相同的字元而已。 
你測試下執行ps和ps|cat就知道原因了!

7.cut有哪些缺陷和不足?

很明顯就是在處理多空格時。 
如果檔案裡面的某些域是由若干個空格來間隔的,那麼用cut就有點麻煩了,因為cut只擅長處理“以一個字元間隔”的文字內容

在shell中遇到字串問題,首先考慮的是grep ,sed ,awk , cut

串擷取中用簡單方法就能做到的事情 ${}

1)shell中的單引號比雙引號的區別:單引號關閉所有有特殊作用的字元,而雙引號只要求shell忽略大多數,具體的說,就是①美元符號②反引號③反斜槓,這3種特殊字元不被忽略 
(2)求字串長度 —– (1)expr {#x}

(3)求字串子串 —– pos位置,len可省略

(4)字串替換 —– {x//a/b}用b替換所有的a 
(5)字串首尾擷取—– {x##*/}去掉所有/左邊的字元,也可用其它匹配代替*/{x#/}只去掉第一次出現/左邊所有的字元。順序為從左到右.{x%%/*}去掉所有/右邊的字元,{x%/}去掉第一次出現/右邊的字元,順序為從右到左. 
6)Shell陣列定義 a=(1 2 3 4),不能有空格,比如a =(1 2 3 4)和a=(1 2 3 4)都是不允許的。

(7)陣列長度: {#a[@]}  
或者
{#a[*]} ;全部陣列 
{a[@]}或  
 {
a[*]}返回1 2 3 4

(8)陣列元素的長度 {#a[i]},i為下標,和其它語言一樣,從0開始,  
陣列元素
{a[i]} 
(9)Shell 變數,在Shell中有三種變數:系統變數,環境變數,使用者變數

系統變數:

$# 傳遞到指令碼的引數個數;

$$指令碼執行的當前程序id;

$?最後命令的退出狀態,0表成功;

$!上一個命令的PID ;

[email protected] 以”引數1” “引數2” … 形式儲存所有引數 ;

0表示指令碼名稱

使用者變數:用set命令檢視

環境變數:用setenv檢視

相關推薦

Linux--shell字串擷取

1.在linux中字串的擷取我們可以用一個命令叫做cut,cut主要擷取方法有三種 1)位元組(bytes),用選項-b ,使用方法cut -b/c/f  2)字元(characters),用選

Linux字串擷取命令

cut命令 它的主要格式為cut -d : -f 1 test.txt 意思是以:為分隔符,取第一列,但這個命令不是萬能的,會遇到以空格為分隔符的問題,這是就需要awk命令。 它預設的分隔符是tab空格。 awk命令 cut命令能

Shell字串擷取方法

這篇文章主要介紹了Shell指令碼8種字串擷取方法總結,每個方法給出了例項程式碼和操作結果,一目瞭然,需要的朋友可以參考下 Linux 的字串擷取很有用。有八種方法。 假設有變數 var=http://www.aaa.com/123.htm. 1. # 號擷取,

Pytohn實現Linux shell的wc命令

python wc #!/usr/bin/python import sys import os from optparse import OptionParser def opt(): parser = OptionParser() parser.add_option("-c

1.Linux Shell的變量

proc shell parameter 顯式 nbsp 位置 login shell中的 自己 1. Shell變量類型 Shell是一種動態類型語言(不使用顯式的數據聲明)和弱類型語言(變量的類型操作根據需求而不同)。Shell中的變量是不分類型的(都是字符串類型),但

Linux Shell有三種引號的用法

containe ubunt ref highlight 處理 alt 返回 cin test Linux Shell中有三種引號,分別為雙引號(" ")、單引號(‘ ‘)以及反引號(` `)。 其中雙引號對字符串中出現的$、‘‘、`和\進行替換;單引號不進行替換,將字符串

linux shell 的 2>&1 用法說明

pass 重定向 分解 說明 分別是 理解 重新 這樣的 通用 linux中有三種標準輸入輸出,分別是 STDIN,STDOUT,STDERR,對應的數字是 0,1,2。 STDIN 是標準輸入,默認從鍵盤讀取信息; STDOUT 是標準輸出,默認將輸出結果輸出至終端,也

shellLinux shell括號的用法

linux shell 中括號 運維 編程 Linux shell中括號的用法 概述 本文主要介紹Linux中括號的用法,主要包含判斷文件和變量。 **註意事項**:中括號兩邊必須有空格。 使用中括號會涉及到的知識 &&、|| 在本文對文件或

常見Linux Shell的特殊符號含義

運算 variable help erb null 作用 pip == 不可 在Shell的實際使用中,有編程經驗的很容易上手,但稍微有難度的是shell裏面的那些個符號,各種特殊的符號在我們編寫Shell腳本的時候如果能夠用的好,往往能給我們起到事半功倍的效果,下面就羅列

linux shell 的特殊符號

萬用字元,代表零個或多個任意字元? 只代表一個任意的字元 註釋符號,即#後面的內容都會被忽略 \ 脫義字元,會將後面的特殊符號還原為普通字元| 管道符,將前面的命令的輸出作為後面命令的輸入wc -l 計算一個文件有多少行命令cut格式: cut -d '分隔字元‘ [ -cf ] n-d 後面跟分隔字元

Shell字串拼接的方法

我們可以看到在系統中,字串的拼接方法為(.bash_profile檔案): PATH=$PATH:$HOME/.local/bin:$HOME/bin 以及《Linux命令列與Shell指令碼程式設計大全中提到的》 var=${var1}${var2} #!/bin/bash va

Linux shell自動完成登錄

分享 ont 指定 png 服務 ict 密碼 操作 uri 在寫shell腳本時,需要登錄到不同的服務器上執行相關命令,在未建立信任之前如何批量操作。 1、ssh 首次登錄服務器時會提示RSA key fingerprint輸入yes/no,可以通過

Shell字串比較忽略大小寫的問題

兩個字串,要比較忽略大小寫後是否相等的問題,可以有很多種方法。 方法一: 藉助tr命令來處理 #!/bin/bash name1="TOm" name2="tom" temp1=$(echo $name1 | tr [a-z] [A-Z]) # 將name1全部轉變成大寫再做比較

linux Shell grep+wc取值在shell的結果與手動執行結果不一致的坑

vim restart.sh #!/bin/bash VDS=ps -ef |grep -w vds|grep -v grep|wc -l if [ $VDS -eq 0 ];thencd /usr/local/program;./linux-start.sh restartelseecho "It's

shell指令碼字串擷取

Shell指令碼8種字串擷取方法總結 Linux 的字串擷取很有用。有八種方法。 假設有變數 var=http://www.aaa.com/123.htm. 1. # 號擷取,刪除左邊字元,保留右邊字元。 程式碼如下: echo ${var#*//} 其中 var 是變數名,# 號是運算子,

linux shell /dev/null 2>&1 含義

shell中可能經常能看到:echo log > /dev/null 2>&1 命令的結果可以通過%>的形式來定義輸出/dev/null :代表空裝置檔案>  :代表重定向到哪裡,例如:echo "123" > /home/123.

linux shell./a.sh , sh a.sh , source ./a.sh, . ./a.sh的區別

      在linux shell中, 執行shell script的方式有多種, 有什麼區別呢?  實際上我之前說過, 現在用一個簡單例子再來說下。       a.sh的內容是: #! /bin/bash echo hello world echo "PID of

[work] Linux Shell的陣列及遍歷

在Linux下使用shell的時候,為方便起見,偶爾會用到一下陣列。陣列的申明方式是: [java] view plain copy array=(element1 element2 element3 .... elementN)   也就是直接用圓括號包陣列元素包起來,陣

shell字串為空的判斷方法

主要有以下幾種方法: echo “$str”|awk '{print length($0)}'expr length “$str”echo “$str”|wc -c但是第三種得出的值會多1,可能是把結束符也計算在內了判斷字串為空的方法有三種:if [ "$str" =  ""

linux shell獲取字串長度的多種方法總結

前言 我們在日常工作中,對於求字串操作在shell指令碼中很常用,實現的方法有很多種,下面就來給大家歸納、彙總了求字串的幾種可能方法,話不多說了,來一起看看詳細的介紹吧。 方法如下: 【方法一】:利用${#str}來獲取字串的長度 【方法二】:利用awk的length方法