Linux Shell Scripting Cookbook 讀書筆記 2

cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自動化交互python

1. cat的用法linux

壓縮連續的空白行git

cat -s fileshell

也能夠用tr,將連續'\n',壓縮成一個'\n'bash

cat file | tr -s '\n'服務器

顯示製表符session

cat -T filessh

顯示行號spa

cat -n file命令行

 

2. script命令

錄製: script -t 2> time.log out.session

type commands;

exit退出錄製

回放: scriptreplay time.log out.session

 

記錄日誌: script -aq out -c "pwd"

能夠將-c裏面執行命令的結果保存到out文件,達到記錄日誌的目的

 

3. find命令

多條件組合

注意括號須要轉義,後面必須有空格

查找shell還有python文件

目錄深度

find . -mindepth 2 -type f

find . -maxdepth 1 -type d

文件類型

find . -type d  # d表示目錄,f表示文件,l表示連接

文件時間,linux中沒有文件建立時間概念

-atime,用戶最近一次訪問文件的時間; -mtime,文件內容最後一次被修改的時間; -ctime,文件元數據(metadata,例如權限或全部權)最後一次改變的時間

其中-表示小於,+表示大於

查找七天內被訪問過的文件: find . -type f -atime -7; 剛好在七天前被訪問的文件: find . -type f -atime 7; 超過七天被訪問的文件: find -type f -atime +7

類似的有amin,mmin,cmin,以分鐘爲單位

文件大小

-size ( b,塊 512字節; c,字節; w,字 2字節; k, 千字節; M,兆字節; G )

其中-表示小於,+表示大於

刪除文件 -delete

刪除當前目錄下全部.swp文件: find . -type f -name "*.swp" -delete

全部權或用戶查找

find . -type f -perm 644

find . -type f -user sryan

結合find執行命令,-exec

將當前目錄下用戶爲root的文件改成sryan

find . -type f -user root -exec chown sryan {} \;

{}是find搜尋的結果,\轉義分號,不讓shell解釋,意思該分號是給-exec使用

-exec只能接受單個命令,因此若是有多個命令,能夠寫成腳本,-exec ./comand.sh {} \;

find命令所有輸出只是一個單數據流(stdin),只有當多個數據流被追加到文件時,纔有必要用用>>

find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt  #將當前目錄下全部c程序文件拼接起來寫入文件

find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \; #將大於10天的txt文件移動到OLD目錄下

修剪,跳過指定目錄

find dev/folder \( -name ".git" -prune \) -o \( -type f -print \) # 排除.git目錄,打印全部文件的名稱和路徑

只查看目錄下非隱藏的文件, 試了下,若是不加-o選項,則-prune不會起做用

 

4. xargs

有些命令沒法接收stdin數據流,xargs可以將標準輸入數據先格式化,轉換成命令行參數

將多行轉換成單行輸出, xargs默認是按照「 」空格來格式化的

-n 指定每行最大參數數量

-d 指定定界符,注意是區分大小寫的

-I 選項指定一個替換字符串

cat args.txt | xargs -I {} ./test.sh -p {} -l

至關於 .test.sh -p arg1 -l

test.sh -p arg2 -l

與 -i 的區別

與find的結合

誤區: find . -type f -name "*.txt" -print | xargs rm -f

沒法預測find輸出結果的定界符到底是'\n'仍是空格' ',不少文件名中含有空格

誤刪了hell文件,可是hell test.txt沒刪掉,由於xargs是以空格爲定界符的

find . -type f -name "*.txt" -print0 | xargs -0 rm -f

xargs -0 將\0做爲指定的定界符

統計每一個txt文件的行數

 

5. tr

對來自標準輸入的字符進行替換,刪除以及壓縮。沒法經過命令行參數接收輸入

tr後面的兩個參數須要等長,若是前面短,則截斷後面;若是前面長,則後面的用最後一個字符補齊

-d 刪除

-s 壓縮,能夠用來去除多餘空格

$[ ] 是執行算術運算

字符類替換

alnum: 字母和數字;   alpha: 字母;    cntrl: 控制字符

digit: 數字;   graph: 圖形字符;  lower: 小寫

upper: 大寫;    print: 可打印字符;   punct: 標點符號

space: 空白字符;   xdigit: 十六進制

 

6. 產生tmp文件

或者使用$RANDOM

或者temp_file=/tmp/var.$$,在腳本中,$$會被擴展成當前運行腳本的進程id

 

7. 生產固定大小的文件

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

生成大小爲100kb而文件內容所有是0

 

8. 字符串截取

${var%.*},刪除位於%右側的通配符(.*)所匹配的字符串,通配符從右向左匹配

貪婪模式

${var#.*},刪除位於#左側通配符(.*)所匹配的字符串,通配符從左向右匹配

 

9. 批量文件重命名

rename 'y/A-Z/a-z/' *  #大寫替換成小寫,*匹配全部文件

find . -type f -exec rename 's/ /_/g' {} \;   #將全部文件裏的空格替換成_

 

10. 自動化交互

#!/bin/expect

spawn kinit sryan
expect "Password*"
send "Mypassword\n"
expect eof # interact

spawn: 啓動你要自動化的的進程

expect:須要等待的信息

send: 要發送的信息

expect eof: 指明命令交互結束

interact: 將交互狀態保留給控制檯,例如ssh進入後,若是不加這句,就會退出,而不是留在遠程服務器上

相關文章
相關標籤/搜索