shell用法大全
文章目錄
- 基本介紹
- 操作文件目錄
- 列出文件(ls命令)
- 獲取當前目錄(pwd命令)
- 查看文件內容(cat,more,less,head,tail)
- cat命令
- more和less命令
- head和tail命令
- 統計文件行數和字數(wc)
- 創建文件和目錄(touch,mkdir)
- 刪除文件和目錄(rm)
- 重命名文件和目錄(mv)
- 移動文件和目錄(mv)
- 建立文件和目錄的鏈接(mv)
- 復制文件和目錄(cp)
- 權限控制(chmod)
- 輸入輸出重定向和管道
- 重定向(覆蓋)
- 重定向(追加)
- 標準輸入
- 標準錯誤輸出
- 管道
- 文件描述符
- 進程
- 進程查看
- 前臺進程與后臺進程
- 前臺進程轉后臺進程
- 后臺進程轉前臺進程
- nohup
- 殺死進程
- 字符串操作
- cut命令
- paste命令
- sort和uniq命令
- 變量
- 定義變量
- 刪除變量
- 數組變量
- 本地變量和環境變量
- shell變量
- 特殊變量
- 流程控制
- 條件分支
- while循環
- for循環
- break語句
- continue語句
- 變量替換
- 高級獲取參數(getopts)命令
- 文件替換
- 命令替換
- 算數運算符替換
- 引用
- 函數
- 常用工具
- find查找文件
- which查找命令所在路徑
- xargs命令
- file命令判斷文件類型
- dd命令數據備份
- 壓縮與解壓
- 下載
- 信號
- 發送信號
- 處理信號
- 忽略信號
- linux三劍客
- 基礎正則表達式
- ^(對于每一行以...開頭)
- $(對于每一行以...結尾)
- ^$(空行)
- .(任意一個字符)
- *(前一個字符連續出現0或者多次)
- .*(任意字符,貪婪匹配)
- .*?(任意字符,非貪婪匹配)
- \[](方括號內字符或關系)
- 擴展正則表達式
- + 號,前一個字符出現了1次或者多次以上
- () 被括起來的內容,表示一個整體(一個字符)
- {} 連續出現
- ?連續出現,前一個字符出現0次或者1次
- 三劍客
- grep
- sed
- 特點和格式
- 查
- 刪
- 增加
- 替換
基本介紹
- 執行/etc/profile
- 執行/etc/profile.d/.sh
- 執行~/.bash_porfile
- 執行~/.bashrc
- 執行/etc/bashrc
操作文件目錄
列出文件(ls命令)
ls命令存在如下常用參數
| -F | 判斷列出的是文件還是目錄 |
| -l | 列出文件的詳細信息,包括權限,大小(byte單位,如果想要更友好可以-lh),最后修改時間 |
| -a | 同時顯示隱藏文件和目錄 |
| -t | 按照最后修改時間排序 |
| -r | 在原來的基礎上倒序 |
獲取當前目錄(pwd命令)
獲取當前用戶所在的目錄命令:pwd
有個需求,已知文件的路徑,想獲得文件名或者文件所在的目錄名
可以使用basename和dirname命令
結果:
/root/dexuan/server.py basename:server.py dirname:/root/dexuan查看文件內容(cat,more,less,head,tail)
cat命令
cat可以跟上多個文件名字,將內容進行拼接后打印到終端
cat [option] [file]
| -n | 顯示行號 |
| -b | 只給非空行添加標號 |
more和less命令
有時候文件內容太多,使用cat命令就不合適,使用more和less命令都可以實現分頁查看。
區別:
- more:只能用空格鍵一頁一頁顯示文件內容,直到文件結束,more命令退出
- less:可以按PageUp或者PageDowm或者上下方向鍵來回反復瀏覽文見內容,Q退出
head和tail命令
如果我們只關心文件內容的開頭和結尾,就可以使用head和tail命令
| -n | 限制輸出行數 |
| -c | 限制輸出字節數 |
| -f | 動態展示內容 |
統計文件行數和字數(wc)
wc test.sh輸出:
5 10 119 test.sh第一列是行數,第二列是字數,第三列是字節數
|–|--|
| -l | 只統計行數 |
| -w |只統計字數 |
| -c | 只統計字節數|
創建文件和目錄(touch,mkdir)
創建文件夾:
創建目錄:
mkdir命令,最常用的就是-p選項,遞歸創建
mkdir -p /root/dexuan/test刪除文件和目錄(rm)
最常用的,rm -rf ./test.sh
重命名文件和目錄(mv)
mv souce dist
例子:將當前目錄test.sh重命名為t.sh
mv ./test.sh t.sh移動文件和目錄(mv)
同樣是mv命令,但是要注意一點,假如說你要移動的文件或者文件夾與目的地的文件或者文件夾存在重名,就會直接覆蓋,可以給mv加個-i參數,重名時候會提示。
建立文件和目錄的鏈接(mv)
可以把鏈接理解成快捷方式。
具體命令如下:
例子:
ln -s ./souce ./souce_link cd souce_link pwd -L pwd -Ppwd -L 會打印出邏輯地址,即./souce_link
pwd -P會顯示物理地址,即./souce
復制文件和目錄(cp)
命令和mv格式基本一致
cp souce dist如果想移動目錄,就需要加-r參數
cp -r souce dist權限控制(chmod)
linux一共存在3種權限,分別是讀,寫,執行
以以下命令為例:
[root@i-zd7on5h0 ~]# ls -l total 16572 drwxr-xr-x 3 root root 4096 Dec 20 22:53 dexuan drwxr-xr-x 19 501 501 4096 Dec 1 23:41 Python-3.7.1 -rw-r--r-- 1 root root 16960060 Oct 20 2018 Python-3.7.1.tar.xzdrwxr-xr-x
- 第一個d代表目錄
- 2-4代表文件所有者的權限
- 5-7代表文件所屬組的權限
- 8-10代表文件所有者的權限
drwxr-xr-x代表著是一個文件夾,root用戶對其有讀寫執行權限,root用戶組內其他成員對其只有讀和執行權限,非該用戶組的用戶也有讀和執行權限
如何修改文件或者目錄權限呢?
例子:
修改test.py文件權限,root用戶對其有讀寫執行權限,root用戶組內其他成員對其只有讀和執行權限,非該用戶組的用戶也有讀和執行權限
輸入輸出重定向和管道
linux最重要的設計思想就是一切皆文件,如顯示屏幕是個設備文件,網絡連接也是一個文件。linux運行的每一個進程都會默認關聯到3個打開的文件上,他們是:標準輸入,標準輸出,以及錯誤輸出
重定向(覆蓋)
linux中重定向輸出的格式是
command >outputfile如果outputfile存在,就會覆蓋掉原來的內容
如
把ls輸出的內容重定向到test.txt文件中
重定向(追加)
linux中重定向輸出的格式是
command >>outputfile如果outputfile存在,就會追加輸出內容到文件末尾
標準輸入
read online <test.txt這句話的意思是將test.txt的一行輸入到變量online中
例子:
test.txt內容如下,要求打印文件的每一行
echo.sh
#!/bin/bashread oneline while [ "$oneline" != "" ] do echo "$oneline" read oneline doneexit 0輸出:
[root@i-zd7on5h0 dexuan]# ./echo.sh <test.txt hello dexuan標準錯誤輸出
指定輸出到標準錯誤輸出代碼如下
echo "errormsg" > &2重定向代碼如下:
./echo2.sh >standard.out 2>error.err此時會把進程標準輸出重定向到standard.out,錯誤輸出重定向到error.err
例子:
下面是echo2.sh代碼
輸出如下:`
./echo2.sh error print [root@i-zd7on5h0 dexuan]# ./echo2.sh >standard.out 2>error.err [root@i-zd7on5h0 dexuan]# cat standard.out print [root@i-zd7on5h0 dexuan]# cat error.err error [root@i-zd7on5h0 dexuan]#如果想要將正常和錯誤的重定向內容全部放在一個文件中,可以這樣:
./echo2.sh >standard.out 2>&1管道
一個程序的標準輸出想作為下個程序的輸入,那該怎么辦呢,可以使用管道符處理
命令1 | 命令2注意,下一個命令需要是讀取標準輸入流進行處理的命令,管道才能生效,如less, more, head, tail 等都是可以接受 standard input 的管線命令,ls, cp, mv 等就不是管線命令。
文件描述符
文件描述符,可以理解成符號與文件的映射關系,系統自帶的3個文件描述符,stdin:0,stdout:1,stderr:2,其他的需要自己定義。
定義:
echo "output" >4&意思是這段話輸出到文件描述符為4的文件中。
此時只需要定義文件即可,加入上述腳本存在test.sh中,那么可以定義下面命令:
./test.sh 4>out.txt把文件描述符為4的輸出,輸出到out.txt
進程
進程查看
https://www.cnblogs.com/fakerbin/p/6513365.html
jobs命令,查看后臺進程命令
前臺進程與后臺進程
- 一個進程占據了整個終端,叫做前臺進程
- 進程啟動后不占據終端,終端可以繼續執行命令
前臺進程轉后臺進程
一般我們啟動命令都是前臺進程,假如我想創建后臺進程,應該怎么辦呢?可以使用&符號
如:
./start.sh &就是將start.sh腳本后臺運行
但是這樣也有弊端,這個進程的標準輸出或者標準錯誤輸出會顯示在終端上,這是我們不希望的,那么我們應該怎么辦呢?重定向就起到作用了
后臺進程轉前臺進程
有時候后臺進程需要標準輸入,這時候程序就會阻塞等待標準輸入,就需要將后臺進程轉到前臺,此時fg命令就有用了
fg %工作號工作號就是jobs命令查看后臺進程編號
nohup
使用上面方式進行后臺進程的啟動會存在弊端,就是假如父進程退出了,子進程也會跟著被殺死。那么nohup命令就是解決這個問題的,當父進程退出后,nohup啟動的命令會被init進程接管。具體命令如下:
nohup ./start.sh >output.txt 2>1& &殺死進程
kill -9 pid-9是參數,表示強制刪除
最常見的是9和15
9) SIGKILL
用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。
15) SIGTERM
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
killall命令會殺死帶有輸入的所有進程
killall 進程名稱如
[root@localhost ~]# ps -ef|grep viroot 17581 17398 0 17:51 pts/0 00:00:00 vi test.txtroot 17611 17582 0 17:51 pts/1 00:00:00 grep vi[root@localhost ~]# ps -ef|grep viroot 17581 17398 0 17:51 pts/0 00:00:00 vi test.txtroot 17640 17612 0 17:51 pts/2 00:00:00 vi test.logroot 17642 17582 0 17:51 pts/1 00:00:00 grep vi[root@localhost ~]# killall vi[root@localhost ~]# ps -ef|grep viroot 17645 17582 0 17:52 pts/1 00:00:00 grep vi字符串操作
cut命令
-b :以字節為單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標志。
-c :以字符為單位進行分割。
-d :自定義分隔符,默認為制表符。
-f :與-d一起使用,指定顯示哪個區域。
例如:
保留ls -l 每一行的第3-5個字符
結果:
[root@VM-101-190-centos ~]# ls -l | cut -b 3-5 tal w-r wxr wxr wxr wxr w-r w-r wxr例2:
echo $PATH | cut -d ':' -f 1根據:對字符串分割,留下第一個
結果:
paste命令
paste number.txt name.txt -d :將number.txt各行和name.txt各行進行拼接,拼接符為:
sort和uniq命令
- sort 可針對文本文件的內容,以行為單位來排序
- uniq 命令用于檢查及刪除文本文件中重復出現的行列,一般與 sort 命令結合使用
變量
定義變量
在shell中,定義變量直接就是
name=valueshell中沒有變量類型,都是字符串
假如要把執行命令的標準輸出流弄到變量中去
例子:
name=`ls`就是將ls輸出的內容賦值到變量name中
如果想要輸出變量,就可以使用$符號
刪除變量
unset命令用于刪除變量或函數
可以刪除普通變量,數組變量以及函數變量
數組變量
初始化數組一共有2種方法
第一種:
第二種:
array=( v1 v2 v3 )空格分開各個元素
如果指定某個值賦值給哪一個元素了,就可以用下面的方法
引用數組的方式如下:
引用數組某個值:
引用數組所有列表并打印:
t=${array[@]} for i in $t doecho $i done本地變量和環境變量
- 本地變量:shell啟動子進程的時候,變量不會傳遞到子進程中。
- 環境變量:創建子進程可以創建父進程中的
如何創建環境變量呢
export name=value name=value;export所有子進程可以使用父進程的環境變量,但不能修改父進程的環境變量
shell變量
當shell啟動的時候,會初始化一些特殊變量。
- HOME:當前用戶主目錄
- SHELL:當前用戶所使用的shell程序,如/bin/bash
- USER:當前的登陸用戶名
- UID:擴展為當前用戶數字的userid
- BASH_VERSION:當前所使用的bash版本號
- PWD:當前工作目錄
- OLDPWD:前一個工作目錄,即執行cd命令以前所在的目錄
- SCECONDS:當前shell執行的時間
- RANDOM:產生0-32767隨機整數
- PATH:環境變量
特殊變量
也就是參數變量
./test.sh param1 param2test.sh內容
#!bin/bash echo $# echo $0 echo $1 echo $2此時答應出來內容:
2
./test.sh
param1
param2
param1 param2
- $# 代表參數個數
- $@ 輸出參數列表
- $? 代表上一個命令是否執行成功,0就是成功
- $$ 代表當前進程的pid
流程控制
條件分支
if list1 thenlist2 elif list3 thenlist4 elselist5 fi如果list1退出狀態為0,說明這個分支觸發成功。
list可以是條件表達式,對于數字的比較有以下幾種
- eq:等于
- ne:不等于
- -le:小雨等于
- gt:大于
- ge:大于等于
對于字符串的比較
- == 兩個字符串相等
- != 兩個字符串不相等
while循環
while 條件 do循環內容 donefor循環
for i in 列表 do循環內容 done for (i=1;i<=100;i++) do循環內容 donebreak語句
break語句的基本語法為
break [n]n可以忽略,如果忽略就是跳出最內層循環,如果n有值,就是跳出n層循環
continue語句
break語句的基本語法為
continue [n]n可以忽略,如果忽略就是繼續最內層循環,如果n有值,就是繼續n層循環
變量替換
高級獲取參數(getopts)命令
getopts optstring name [args]- optstring是選項
- name 是放選項的變量
- 第一個冒號 getopts 會區分 invalid option (無效選項) 錯誤和 miss option argument(丟失選項)錯誤。
- while循環中每次都會執行getopts命令,每處理一個命令getopts會返回0,直到所有命令都處理完,返回1,退出循環。
- getopts在處理每一個需要參數的選項時,都會把參數保存到變量OPTARG中。
- 如果在getopts命令某個選項字符后面添加了冒號,說明該選項需要參數。
文件替換
常用通配符
| * | 匹配0個或者多個任意字符 |
| ? | 匹配1個任意字段 |
| [] | 匹配指定字符范圍中任意一個字符 |
例子
ls ?.txt # 顯示文件名以txt結束并且文件名只有1位的文件 ls [ab]* #顯示文件名以a或者b起始的文件 ls [^ab]* #顯示文件名不以a或者b起始的文件 ls [!ab]* #顯示文件名不以a或者b起始的文件 ls [a-c]* #顯示文件名以a或者b或者c起始的文件命令替換
有時候希望一個命令中引用另一個命令的輸出,這時候就需要用到命令替換。
$(commands) `commands`可以將命令賦值給變量,變量替換下一個命令
例子:
第一個輸出ls字符串,第二個輸出ls命令的標準輸出流
算數運算符替換
$((expression))例子
echo $((3+2*4/8))輸出:4
引用
當命令中存在特殊字符時候,就需要被引用。
例子,當目錄存在tmp*.txt文件時候,我們需要刪除這個文件,這時候如果直接使用rm -rf tmp*.txt時候,命令把*當成通配符處理,會造成誤刪除。這時候就需要引用。
- 對于單個特殊字符,可以使用\來引用,如rm -rf tmp\*.txt
- 對于大量字符的時候,可以使用單引號,如echo '$(ls)',此時輸出的內容就不是ls命令的標準輸出,而是$(ls)字符串
- 當想引用單個字符但是保留變量,可以使用雙引號,如echo "list is : $(ls)",輸出內容就是list is : test.txt,如果不想引用某個變量,就可以加\,如echo "list is : \$(ls)",輸出內容就是list is : $(ls)
函數
定義函數
name(){ command-list }執行函數
name刪除定義
unset name帶參數函數
name(){ $1 代表第一個參數 $2 代表第二個參數 $# 代表參數個數 } name 參數1 參數2常用工具
find查找文件
find [path] [expression]- path參數指定了find所要查找的目錄樹的起點,可以制定多個目錄樹作為起點
- expression可以由若干個表達式構成搜索條件
具體見:https://www.cnblogs.com/soymilk2019/p/11758086.html
當找到后,我們可以使用-exec ls -l { } \來制定找到后所想要執行的命令。
無論find命令看上去多復雜,其本質指定了3個部分:搜索起始目錄,一些搜索條件,對于找到文件所做的操作。
which查找命令所在路徑
which 命令 whereis 命令例子:
which ls輸出:
/usr/bin/ls
xargs命令
如果有大量文件需要刪除,-exec參數是十分消耗資源的,如果使用$(command)進行rm命令的拼接,有可能參數超出rm命令所能容納的參數。xargs就派上用場了。
command1 | xargs command2命令command1的標準輸出流經管道作為xargs命令的標準輸入當作命令command2的參數執行。如果xargs從標準輸入得到大量參數,會智能分步執行。
file命令判斷文件類型
file 文件名dd命令數據備份
dd 能保持文件的原有的格式布局,cp只是針對數據填滿一款存儲區域,對于一些較大的具有特殊文件,建議使用dd
dd if=[file] of=[file] count=[blocks] bs=[bytes]- if告訴dd輸入數據
- of告訴dd輸出數據到指定地方
- count指定數據大小
- bs指定一次讀寫的字節數
壓縮與解壓
https://blog.csdn.net/shengjie87/article/details/106684662
下載
curl和wget
信號
發送信號
我們可以把信號看作是軟中斷,當有一些重要事件發生的時候,他們就會發送到程序中。如何發送信號呢,kill命令就是專門發送信號的。
信號可以理解為一個進程給另外一個進程發送消息。
處理信號
trap命令可以定義信號的回調處理函數。
trap cmd 信號1 信號2當其他進程給這個進程發送信號的時候,就會執行cmd命令或者函數。這個有什么用呢?
比如有個命令會產生緩存文件,當命令執行完成后會刪除緩存文件,然而有時候這個命令執行到一半被殺了,這時候緩存文件還保留在硬盤中,這樣不好。我們可以使用trap命令,當接收到TERM信號后,可以回調rm命令刪除緩存。
當一個進程接收到一個信號后,先會查看該信號是否被忽略,如果沒有被忽略就執行注冊的信號處理函數,如果沒有注冊就會執行默認行為。
忽略信號
有時候我們不希望進程被殺掉,怎么辦,就可以使用忽略信號。
只需要把trap命令中的操作指定為空就可以
那么此時如果進程接收到了相關信號,就會進行信號忽略。
linux三劍客
基礎正則表達式
^(對于每一行以…開頭)
例子:
輸出以e打頭的每一行
$(對于每一行以…結尾)
例子:
輸出以s結尾的行
^$(空行)
常見作用:排除文件中空行
grep -v "^$" 文件名.(任意一個字符)
例子:
輸出以s包含exxo的行,x代表任意字符
*(前一個字符連續出現0或者多次)
.*(任意字符,貪婪匹配)
什么叫貪婪匹配呢,舉個例子
grep "^.*t" test.txt這時候test.txt內容為
jstqdetsssa jjjjtkkkktooootssss這時候他會以貪婪模式進行匹配,也就是匹配到了下面內容
jstqdetsssa
jjjjtkkkktooootssss
會盡可能多的匹配內容
.*?(任意字符,非貪婪匹配)
grep "^.*?t" test.txt這時候test.txt內容為
jstqdetsssa jjjjtkkkktooootssss這時候他會以貪婪模式進行匹配,也就是匹配到了下面內容
jstqdetsssa
jjjjtkkkktooootssss
遇到第一個匹配到就會停止
[](方括號內字符或關系)
- [abc] 匹配a或者b或者c
- [a-z] 匹配任意小寫字母
- [0-9] 匹配任意數字
- [a-zA-Z0-9] 匹配任意小寫字母或者大寫字母或者數字
- [^ab] 除了a或者b以外的任意字符
- [a-z|A-Z] 匹配任意小寫字母或者大寫字母或者|
擴展正則表達式
+ 號,前一個字符出現了1次或者多次以上
grep -E "0+" test.txtgrep只支持基礎正則,如果想要進行擴展,只能加-E,
0+代表0出現了1次或者多次以上。
一般與[]擦出不一樣的火花
如:
匹配出數字
() 被括起來的內容,表示一個整體(一個字符)
例子
grep -E "oldb(o|e)y" test.txt匹配oldboy或者oldbey
{} 連續出現
o{n,m} 前一個字母o,至少連續出現n次,最多連續出現m次
o{n} 前一個字母o,連續出現n次
?連續出現,前一個字符出現0次或者1次
例子
grep -E "go?d" test.txt匹配gd或者god
三劍客
| grep | 過濾 | 過濾速度最快 |
| sed | 替換修改文件內容,取行 | 取出范圍內容,修改文件內容 |
| awk | 取列,統計計算 | 取列,對比,比較 |
grep
| -E | 支持擴展正則 |
| -A | -A5 匹配你要的內容并且顯示接下來的5行 |
| -B | -B5 匹配你要的內容并且顯示接上面的5行 |
| -C | -C5 匹配你要的內容并且顯示接上下5行 |
sed
特點和格式
功能:找誰干啥,找誰(某一行),干啥(增刪改查)
默認不支持擴展正則,如果要加擴展正則,需要加r參數
查
- 2p. 指定行號進行查找
- 1,5p 指定行號范圍進行查找
- /lidao/p 類似grep過濾,//里面可以寫正則
- /10:00/,/11:00/p 范圍過濾
例子:
刪
參數為d,主要功能為刪除某一行,如果想要刪除某個字符,就需要試用到替換
例子:
增加
- 參數a append追加,向指定行或者每一行追加內容(后一行)
- 參數i insert插入,向指定行或者每一行插入內容(前一行)
- 參數c replace替代,替換這一行的內容
例子:
替換
參數為s
一般格式:
s/查找內容正則/替換內容/g
g代表全局替換,sed默認只替換每一行第一個匹配的內容
例子:
后向引用(先保護,再引用)
例子:
\1代表獲取()中的內容
總結
- 上一篇: 特征选择过滤法-方差过滤、F检验、互信息
- 下一篇: oracle导出exp步骤,oracle