1. 程式人生 > >shell程式設計之變數以及awk命令和rename命令

shell程式設計之變數以及awk命令和rename命令

常用的環境變數可以用env和set檢視,但是最全面的還是man bash來檢視。

在這裡舉例一些常用的環境變數echo $HOSTNAME                  檢視主機名

echo $HOSTTYPE                 檢視主機系統型別

echo $OLDPWD                    檢視上一個路徑

二、變數子串的常用操作

1.${#string}             返回值是該變數結果的長度

ex:

[[email protected] ~]# OLDBOY="I am oldboy"
[[email protected] ~]# echo $OLDBOY
I am oldboy
[
[email protected]
~]# echo ${#OLDBOY} 11

2.${string:number}    返回值是從number值開始(不包括number)往後的字串(開頭遇見空格自動忽略)

[[email protected] ~]# echo ${OLDBOY:2}
am oldboy

3.${string:number1:number2}      返回值是從number1開始往後number2個字元的欄位。

[[email protected] ~]# echo ${OLDBOY:2:4}
am o

4.${string#substring}                  從變數$string開頭開始刪除最短匹配$substring字串

[[email protected] ~]# OLDBOY="I am oldboy I am"

[[email protected] ~]#  echo ${OLDBOY#I am}
oldboy I am

5.${string%substring}                 從變數$string結尾開始刪除最短匹配$substring字串

[[email protected] ~]# echo ${OLDBOY%I am}
I am oldboy

6.${string/word1/word2}           從開始最短匹配,使用word2來代替在$string中存在的第一個word1

[[email protected] ~]#  echo ${OLDBOY/I am/haha}
haha oldboy I am



7.${string/%word1/word2}       從結尾開始,使用word2來代替在$string中存在的第一個word1
[[email protected] ~]#  echo ${OLDBOY/%I am/haha}
I am oldboy haha

統一規律#從頭開始,%從結尾開始。

例子:

1.將該目錄下stu_xikai1.txt             stu_xikai3.txt            stu_xikai5.txt                stu_xikai2.txt           stu_xikai4.txt中的xikai替換成mnt

[[email protected] testdir]# ls
stu_xikai1.txt  stu_xikai3.txt  stu_xikai5.txt
stu_xikai2.txt  stu_xikai4.txt
[[email protected] testdir]# for file in $(ls);do mv ${file} ${file/xikai/mnt};done
[[email protected] testdir]# ls
stu_mnt1.txt  stu_mnt2.txt  stu_mnt3.txt  stu_mnt4.txt  stu_mnt5.txt


2.將如下目錄中的檔名替換為大寫
[[email protected] testdir]# ls
a.html  b.html  c.html  d.html  e.html  f.html  g.html
[[email protected] testdir]# for file in *.html;do mv $file `echo ${file}|tr  "[a-z]" "[A-Z]" ` ; done

[[email protected] testdir]# ls
A.HTML  B.HTML  C.HTML  D.HTML  E.HTML  F.HTML  G.HTML

###########################################################

[[email protected] testdir]# for file in *.HTML ;do mv $file ${file/HTML/html};done
[[email protected] testdir]# ls
A.html  B.html  C.html  D.html  E.html  F.html  G.html

###########################################################

或者:[[email protected] testdir]# for file in *.html ;do mv $file `echo $file|sed 's/HTML/html/g'`;done
[[email protected] testdir]# ls
A.html  B.html  C.html  D.html  E.html  F.html  G.html

###########################################################

awk命令詳解

使用方法

awk '{pattern + action}' {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表示式,用斜槓括起來。

awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。完整的awk指令碼通常用來格式化文字檔案中的資訊。

通常,awk是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。


awk [-F field-separator] 'commands' input-file(s) 

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,預設的域分隔符是空格。


假設last -n 5的輸出如下

[[email protected] ~]# last -n 5 <==僅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

如果只是顯示最近登入的5個帳號

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root
awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。預設域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登入使用者,$3表示登入使用者ip,以此類推。

如果只是顯示/etc/passwd的賬戶

[[email protected] ~]# awk -F ":" '{print $1}'  /etc/passwd

這種是awk+action的示例,每行都會執行action{print $1}。

-F指定域分隔符為':'。

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割
[[email protected] testdir]# cat /etc/passwd |awk -F ":" '{print $1"\t"$7 }'
admin    /bin/bashleo    /bin/bashteo    /bin/bashstudent    /bin/bash


如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行新增列名name,shell,在最後一行新增"blue,/bin/nosh"。
[[email protected] testdir]# cat /etc/passwd |awk -F ":" 'BEGIN {print "name,shell"} {print $1"\t" $7 } END {print "blue,/bin/nosh"}'



需要注意,再利用awk命令時,後邊跟的命令共用一個單引號

awk工作流程是這樣的:先執行BEGING,然後讀取檔案,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行END操作。

搜尋/etc/passwd有root關鍵字的所有行

[[email protected] testdir]# awk -F: "/root/" /etc/passwd

這種是pattern的使用示例,匹配了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。

搜尋支援正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd

搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell

[[email protected] testdir]# awk -F: "/root/"  /etc/passwd  |awk -F ":" '{print $7}'
/bin/bash
/sbin/nologin
[[email protected] testdir]# awk -F: '/root/{print $7}'  /etc/passwd  
/bin/bash
/sbin/nologin


 這裡指定了action{print $7}

awk內建變數

awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。

複製程式碼
ARGC               命令列引數個數
ARGV               命令列引數排列
ENVIRON            支援佇列中系統環境變數的使用
FILENAME           awk瀏覽的檔名
FNR                瀏覽檔案的記錄數
FS                 設定輸入域分隔符,等價於命令列 -F選項
NF                 瀏覽記錄的域的個數(列數)
NR                 已讀的記錄數(行數)
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符
統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:
 awk -F ":" '{print "檔名:" FILENAME "列數:"NF "行數:"NR "完整內容:"$0  }' /etc/passwd
檔名:/etc/passwd列數:7行數:42完整內容:admin:x:1003:1006::/home/admin:/bin/bash
檔名:/etc/passwd列數:7行數:43完整內容:leo:x:1004:1007::/home/leo:/bin/bash
檔名:/etc/passwd列數:7行數:44完整內容:teo:x:1005:1005::/home/teo:/bin/bash
檔名:/etc/passwd列數:7行數:45完整內容:student:x:1006:1008::/home/student:/bin/bash

使用printf替代print,可以讓程式碼更加簡潔,易讀:[[email protected] testdir]# awk -F ":" '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

print和printf

awk中同時提供了print和printf兩種列印輸出的函式。

其中print函式的引數可以是變數、數值或者字串。字串必須用雙引號引用,引數用逗號分隔。如果沒有逗號,引數就串聯在一起而無法區分。這裡,逗號的作用與輸出檔案的分隔符的作用是一樣的,只是後者是空格而已。

printf函式,其用法和c語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,程式碼更易懂。

 變數和賦值

除了awk的內建變數,awk還可以自定義變數。

下面統計/etc/passwd的賬戶人數

[[email protected] testdir]# awk  ' {count++;print $0>1} END {print "user counts is:" count}'  /etc/passwd
user counts is:45
這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:

[[email protected] testdir]# awk  'BEGIN {count=0;print"[START]user count is:",count } {count++;print $0>1} END {print "[END]user counts is:" count}'  /etc/passwd
[START]user count is: 0
[END]user counts is:45
統計某個資料夾下的檔案佔用的位元組數:
[[email protected] testdir]# ls -l|awk ' {a=a+$5} END {print a}'
2264
如果以M為單位顯示:
[[email protected] testdir]# ls -l|awk ' {a=a+$5}  END {b=a/1024 ;print b"M"}'
2.21094M


注意,統計不包括資料夾的子目錄

條件語句

統計某個資料夾下的檔案佔用的位元組數,過濾4096大小的檔案(一般都是資料夾):

[[email protected] ~]# ll | awk 'BEGIN{b=0} {if($5<4096){b=b+$5;} } END {print b/1024"M"}'
0.189453M


迴圈語句

awk中的迴圈語句同樣借鑑於C語言,支援while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。

陣列

  因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的表格裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

顯示/etc/passwd的賬戶

[[email protected] ~]# awk -F ":" 'BEGIN{a=1} {print a++"\t"$1}' /etc/passwd1    
root2    
bin3    
daemon4    
adm5   
RENAME命令簡介:

批量改掉相同之處:rename  "檔案要改的地方"  "改成啥"    要改的檔案

[[email protected] testdir]# ls
1                 stu_102999_2.jpg  stu_102999_4.jpg
stu_102999_1.jpg  stu_102999_3.jpg  stu_102999_5.jpg
[[email protected] testdir]# rename "jpg" "txt" stu*
[[email protected] testdir]# ls
1                 stu_102999_2.txt  stu_102999_4.txt
stu_102999_1.txt  stu_102999_3.txt  stu_102999_5.txt
[[email protected] testdir]# ls
1                 stu_102999_2.txt  stu_102999_4.txt

[[email protected] ~]# awk -F ":" '{print $1}'  /etc/passwd
[[email protected] ~]# awk -F ":" '{print $1}'  /etc/passwd

相關推薦

shell程式設計變數以及awk命令rename命令

常用的環境變數可以用env和set檢視,但是最全面的還是man bash來檢視。 在這裡舉例一些常用的環境變數echo $HOSTNAME                  檢視主機名 echo $HOSTTYPE                 檢視主機系統型別 echo

linux中的shell程式設計變數

shell程式設計主要是為了簡化linux系統管理的。 shell中的變數是一種弱型別的變數,c,java等語言是一種強型別的語言。 linux中的所有的變數預設型別都是字元型別的 零、bash變數的分類 bash變數的型別 變數型別

linux 下shell 程式設計變數及數學運算

1.shell中的變數是不分資料型別的,統一按照字串來儲存 2. bash shell只能支援數學整數運算(zsh可以支援浮點) 3.以下都是在bash shell 下進行的數學運算 方法一使用方括號進行基本的整數運算: #!/bin/bash var1=1 var2=2

shell程式設計變數型別

shell程式設計中系統預設所有變數都是字串型。當需要用到其他型別的變數是需要手動宣告。宣告格式如下: declare [+/-][選項] 變數名     -i 將變數宣告為整型     -a 將變數宣告為陣列型別     -x 將變數宣告為環境變數     -r 將變數宣

1.shell程式設計變數的高階用法

1.1.變數替換 變數替換的六種形式   例項:非貪婪和貪婪的區別 從頭部刪除 [root@VM_0_9_centos shell_learn]# var_1="i love you,do you love me" [root@VM_0_9_centos shell_learn]

01 shell程式設計變數定義

#### 一、SHELL介紹 ㈠ 什麼是shell指令碼? ```bash 簡單來說就是將需要執行的命令儲存到文字中,按照順序執行。它是解釋型的,意味著不需要編譯。 若干命令 + 指令碼的基本格式 + 指令碼特定語法 + 思想= shell指令碼 ``` ㈡ 什麼時候用到指令碼? ```bash 重複化、複

[Linux] Linux中重命名文件和文件夾的方法(mv命令rename命令

文件夾 方法 get 覆蓋 5-0 測試的 命令 使用 重命名文件 原文鏈接 在Linux下重命名文件或目錄,可以使用mv命令或rename命令,這裏分享下二者的使用方法。 mv命令既可以重命名,又可以移動文件或文件夾。 例子:將目錄A重命名為B mv A B 例子:

shell程式設計awk命令詳解

linux本篇部落格主要介紹linux常用命令中的對文字和資料進行處理的命令awk的用法。awk命令awk是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/un

linux中的shell程式設計while迴圈until迴圈

while迴圈語法: while [ 條件判斷式 ] do 程式語句 條件終止語句 done 例項:求1加到100的和 #!/bin/bash #!從1加到100 i=1 s=0 while [ $i -le 100 ] # 如果變數i

Linux學習Shell程式設計——Bash變數——環境變數

1、環境變數,一部分是系統自定義的,還有一部分是使用者新增的,使用者可以改變其值 》環境變數是什麼? 使用者自定義變數只在當前的shell中生效,而環境變數會在當前Shell和這個Shell的所有子Shell當中生效。如果把環境變數寫入相應的配置檔案,那麼這個環境變數就會在所有的Shel

linux shell程式設計利用環境變數IFS自定義分隔符

預設情況下,bash shell將空格符、製表符、換行符看作是欄位分隔符,如果遇到這些字元,bash shell就會認為字元後是一個新的欄位,這就帶來一種困擾:如果我們想處理包含空格、製表符、換行符的字元就會有麻煩了。bash提供了一種自定義分隔符的機制:環境變數IFS定義

ShellShell程式設計for迴圈命令

bash shell提供了for命令,用於建立通過一系列值重複的迴圈,for命令的格式為: for var in list do commands done 在引數list中提供了一系列用於迭代

Linux-shell程式設計bash變數

Bash變數命名規則 必須以字母下劃線開頭,只能由字母下劃線數字組成。 長度不能超過255個字元 變數名在有效的範圍內必須唯一 在Bash中,變數的預設型別都是字串 一 使用者自定義變數 使用者自定

Linux下Shell程式設計算術運算邏輯比較(數值型別、字串型別、檔案型別)

shell程式設計中的算術運算和邏輯比較,主要根據不同運算物件,採用相應的比較、運算方式。 一、數值型 算術運算 ,以變數自增1為例,+ - * / % 等運算方式同理,運算的方式大體四種: i=`expr $i + 1` let i+=1 , let的操作成員不需要

shell特殊符號、cut_sort_wc_uniq命令tee_tr_split命令

sort uniq cut wc shell特殊符號 shell特殊符號* 任意個任意字符? 任意一個字符# 註釋字符\ 脫義字符| 管道符$ 變量前綴 , !$ 組合,正則裏面表示行尾; 多條命令寫到一行,用分號分割~ 用戶家目錄,後面正則表達式表示匹配符& 放到命令後面,會把命

shell筆記變數

什麼是變數 變數即在程式執行過程中它的值是允許改變的量 變數的型別 全域性變數(環境變數) 系統預設定義好的,大寫字母組成,哪裡都可以使用 自定義全域性變數方法注意 變數名大寫 定義變數時需要使用export命令 01.export I=1

Linux學習筆記_shell程式設計變數

shell程式設計之變數 https://www.imooc.com/learn/336 **簡介:**本課程是《Linux達人養成計劃I》中第九章課程的延續,主要介紹Linux shell程式設計基礎中的變數。包括Bash變數的分類和各變數的詳細使用,如:使用者自定義變數、環境變數、語

Shell程式設計if簡單判斷兩個數字大小

#指令碼編輯   #!/bin/bash #定義變數 num1=$1 num2=$2   #判斷是否輸入兩個引數,若是,將兩個引數傳遞給下一個指令動作,若非兩個引數,則列印輸出內容輸出並且退出exit指令碼不執行下一個指令 if [ $# -ne

規範程式設計變數的初始化

一個程序crash的問題, ExceptionClass: Native (NE)Exception Type: SIGSEGV CurrentExecuting Process: pid: 386, tid: 399/system/bin/Tyservice Backtrace:#00 pc

【ROS】cd命令roscd命令的區別,並解決環境變數問題

cd命令和roscd命令都是切換到指定目錄的命令。不同的是,cd是Linux系統的命令,在使用時必須指定目標目錄的完整路徑;而roscd是ros系統中的命令,它可以直接切換到指定目錄(ros系統中的軟體包),而不需要輸入冗長的完整路徑。 例如,要切換到roscpp這個軟體包,兩個命令的格式分