歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linuxshell腳本攻略第二章命令之樂

2.1 用cat進行拼接

1 cat命令是一個日常會使用到的簡單命令,cat本身表示concatenate(拼接)

2 用cat讀取文件的一般格式是

cat file1 file2 file3.... // 這個命令將命令行參數的文件內容拼接在一起輸出

3 cat命令不僅可以讀取文件並拼接數據,它還能夠從標准輸入中進行讀取。要從標准輸入中讀取,就要使用管道

stand_ouput | cat

4 cat命令可以用來壓縮多個空行,使得被壓縮成為單個

cat -s file

5 tr命令也可以把多個的'\n'字符壓縮成為單個'\n'

6 cat命令的-n選項會在輸出的每一行內容之前加上行號,但是這個並不會修改文件的內容

2.2 錄制與回放終端會話

1 script和scriptreplay命令在絕大多數GNU/Linux發行版本上面都可以找到

2 scritp命令同樣可以用於建立多個用戶之間的進行廣播的視頻會話

第一步:打開兩個終端T1和T2

第二步:在T1中輸入mkfifo scriptfifo

第三步:在T2中輸入以下命令cat scriptfifo

第四步:在T1中輸入以下命令script -f scriptfifo

第五步:在T1中輸入的commands都可以在T2中看到

2.3 文件查找與文件列表

1 find是UNIX/Linux命令行工具箱中最棒的工具之一

2 find命令的工作方式如下:沿著文件層次結構向下遍歷,匹配符合條件的文件,並執行相應的操作

3 要列出當前目錄及子目錄下的所有文件以及文件夾:find base_bash

4 find命令的兩個重要的參數

-print 指明打印匹配文件的文件名,當使用-print的時候,'\n'做為分割文件的定界符

-print0 指明使用'\0'作為定界符來打印每一個匹配的文件名

5 根據文件名或正則表達式匹配搜索,-name的參數指定了文件名所匹配的字符串。

比如 find . -name "*.txt" -print // 命令查找當前目錄下的所有txt文件並打印出來

6 find命令有一個選項-iname,該選項的作用和-name類似,但是匹配的時候會忽略大小寫

7 find命令也可以用!來否定參數意思

find . ! -name "*.txt" -print // 命令的作用是找出當前目錄下的所有非txt文件

8 find命令在使用時候會遍歷所有的子目錄,我們可以采用深度參數來限制find命令的遍歷深度。

-maxdepth和-mindepth指定最大的遞歸深度以及最少的遞歸深度(從哪一層開始向下搜索)

9 -maxdepth和-mindepth應該做為find的第三個參數出現,這樣就可以第一時間限制搜索的條件,效率會提高的很多

10 類UNIX系統將所有的一切都視為文件,文件具有不同的類型,例如普通文件,目錄,字符設備,塊設備,符號鏈接,硬鏈接,套接字以及FIFO等

11 find命令的-type選項可以對文件搜索進行過濾

12 type參數來匹配所需要的文件類型

文件類型 類型參數

普通文件 f

符合鏈接 l

目錄 d

字符設備 c

塊設備 b

套接字 s

fifo p

13 刪除匹配的文件,-delete可以用來刪除find查找到的匹配文件

find . -type f -name "*.txt" -delete // 命令的作用是find找出當面目錄下的所有txt文件,然後刪除

14 基於文件權限和所有權進行搜索

find . -type f -name "*.txt" -perm 644 -print // 命令的作用是找到當前目錄下所有權限為644的txt文件

2.4 用tr進行轉換

1 tr可以用來對標准輸入的字符進行替換,刪除以及壓縮,它可以將一組字符變成另一組字符,因而通常也被稱為轉換命令

2 tr只能通過stdin,而無法通過命令行參數來接受輸入。

tr [options] set1 set2 // 將來自stdin的輸入字符從set1映射到set2,並將其輸入到stdout。

set1和set2是字符類或字符集,如果兩個字符集的長度不相等,那麼set2會不斷重復其最後一個字符直到和set1長度相等,如果set2長度大於set1那麼在set2中超出set1的部分長度就全部忽略

3 將輸入字符由大寫轉換成小寫 ,可以使用以下命令

echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' // 'A-Z和‘a-z’都是集合

4 tr有一個選項-d可以通過指定需要被刪除的字符集合,將出現的stdin中的特定字符刪除

echo "Hello 13 world 345" | tr -d '0-9' // 命令可以將stdin中的數字刪除並輸出

5 我們可以利用選項-c來使用set1的補集,-c set1等同於定義了一個集合,這集合中的字符不包含在set1中

6 tr可以像使用集合一樣使用各種不同的字符類,這些字符類型如下所示

alnum: 字母和數字

alpha: 字母

cntrl: 控制字符

digit: 數字

graph: 圖形字符

lower: 小寫字母

print: 可打印字符

punct: 標點符號

space: 空白字符

upper: 大寫字母

xdigit: 十六進制字符

7 可以按照下面的方式選擇要使用的字符集: tr [:class1:] [:class2:]

2.5 排序,單一和重復

1 sort命令既可以從特定文件也可以從stdin中獲取輸入,並將輸入寫入stdout,uniq的工作模式和sort一樣

2 我們可以按照下面的方式輕松的對一組文件進行排序

sort file1 file2 file3 ... > sorted // 命令把多個文件排序然後重定向到sorted

3 按數字進行排序: sort -n file

按逆序進行排序: sort -r file

按月份進行排序: sort -M file

4 如果需要合並兩個排過序的文件,而且不需要對合並後的文件再進行排序,可以使用

sort -m sorted1 sorted2

5 uniq命令通過消除重復內容,從給定輸入中找出單一的行。它也可以用來找出輸入中出現的重復行

6 uniq只能用於排過序的數據輸入,因此uniq要麼使用管道,要麼使用排過序的文件做為輸入

只顯示唯一的行: uniq -u sorted

統計個行中出現的次數: uniq -c sorted

找出文件中重復的行: uniq -d sorted

2.6 分割文件和數據

1 生成一個大小為100KB的測試文件

dd if=/dev/zero bs=100K count=1 of=data.file

上面的命令會創建一個大寫為100KB的文件內容全部都是0

2 我們可以指定分割大小,將文件分割成多個更小的文件

split -b 10k data.file // 這個命令將data.file分割成多個文件,每個文件大小為10KB

2.7 根據擴展名切分文件名

1 借助%我們可以輕松將名稱部分從“名稱.擴展名"這種格式的文件名中提取出來

2 ${var%.*}的含義是

第一:從$var中刪除位於%右側的通配符所匹配的字符串,通配符從右向左進行匹配

第二:給var進行賦值,var=sample.jpg,那麼通配符從右向左匹配到.jpg,因此刪除之

3 %屬於非貪婪操作,它從右到左匹配通配符的最短結果。還有一個是%%是貪婪的,匹配最長的結果

4 類似的#和%的一樣,就是它的匹配是從左到右,屬於非貪婪操作

那麼##和%%類似

Copyright © Linux教程網 All Rights Reserved