日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell用法大全

發布時間:2024/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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命令

#!/bin/bash path="/root/dexuan/server.py" echo $path echo "basename:$(basename $path)" echo "dirname:$(dirname $path)"

結果:

/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)

創建文件夾:

  • 可以直接使用vim命令創建
  • touch命令創建
  • 創建目錄:

    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 源文件名稱 軟鏈接文件名稱

    例子:

    ln -s ./souce ./souce_link cd souce_link pwd -L pwd -P

    pwd -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.xz

    drwxr-xr-x

    • 第一個d代表目錄
    • 2-4代表文件所有者的權限
    • 5-7代表文件所屬組的權限
    • 8-10代表文件所有者的權限

    drwxr-xr-x代表著是一個文件夾,root用戶對其有讀寫執行權限,root用戶組內其他成員對其只有讀和執行權限,非該用戶組的用戶也有讀和執行權限

    如何修改文件或者目錄權限呢?

    例子:

    chmod 755 test.py

    修改test.py文件權限,root用戶對其有讀寫執行權限,root用戶組內其他成員對其只有讀和執行權限,非該用戶組的用戶也有讀和執行權限

    輸入輸出重定向和管道

    linux最重要的設計思想就是一切皆文件,如顯示屏幕是個設備文件,網絡連接也是一個文件。linux運行的每一個進程都會默認關聯到3個打開的文件上,他們是:標準輸入,標準輸出,以及錯誤輸出

    重定向(覆蓋)

    linux中重定向輸出的格式是

    command >outputfile

    如果outputfile存在,就會覆蓋掉原來的內容

    ls >test.txt

    把ls輸出的內容重定向到test.txt文件中

    重定向(追加)

    linux中重定向輸出的格式是

    command >>outputfile

    如果outputfile存在,就會追加輸出內容到文件末尾

    標準輸入

    read online <test.txt

    這句話的意思是將test.txt的一行輸入到變量online中

    例子:
    test.txt內容如下,要求打印文件的每一行

    [root@i-zd7on5h0 dexuan]# cat test.txt hello dexuan

    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代碼

    #!/bin/bashecho "error" >&2 echo "print" >&1

    輸出如下:`

    ./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腳本后臺運行
    但是這樣也有弊端,這個進程的標準輸出或者標準錯誤輸出會顯示在終端上,這是我們不希望的,那么我們應該怎么辦呢?重定向就起到作用了

    ./start.sh >output.txt 2>1& &

    后臺進程轉前臺進程

    有時候后臺進程需要標準輸入,這時候程序就會阻塞等待標準輸入,就需要將后臺進程轉到前臺,此時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個字符

    ls -l | cut -b 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

    根據:對字符串分割,留下第一個
    結果:

    /root/dexuantang/apache-maven-3.6.3/bin

    paste命令

    paste number.txt name.txt -d :

    將number.txt各行和name.txt各行進行拼接,拼接符為:

    sort和uniq命令

    • sort 可針對文本文件的內容,以行為單位來排序
    • uniq 命令用于檢查及刪除文本文件中重復出現的行列,一般與 sort 命令結合使用

    變量

    定義變量

    在shell中,定義變量直接就是

    name=value

    shell中沒有變量類型,都是字符串
    假如要把執行命令的標準輸出流弄到變量中去

    name=`命令`

    例子:

    name=`ls`

    就是將ls輸出的內容賦值到變量name中
    如果想要輸出變量,就可以使用$符號

    name2=$name echo "$name2"xxxxx

    刪除變量

    unset命令用于刪除變量或函數
    可以刪除普通變量,數組變量以及函數變量

    數組變量

    初始化數組一共有2種方法
    第一種:

    array[index]=value

    第二種:

    array=( v1 v2 v3 )

    空格分開各個元素
    如果指定某個值賦值給哪一個元素了,就可以用下面的方法

    array=( [2]=v3 [0]=v1 [1]=v2 )

    引用數組的方式如下:
    引用數組某個值:

    t=${array[0]}

    引用數組所有列表并打印:

    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 param2

    test.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循環內容 done

    for循環

    for i in 列表 do循環內容 done for (i=1;i<=100;i++) do循環內容 done

    break語句

    break語句的基本語法為

    break [n]

    n可以忽略,如果忽略就是跳出最內層循環,如果n有值,就是跳出n層循環

    continue語句

    break語句的基本語法為

    continue [n]

    n可以忽略,如果忽略就是繼續最內層循環,如果n有值,就是繼續n層循環

    變量替換

    高級獲取參數(getopts)命令

    getopts optstring name [args]
    • optstring是選項
    • name 是放選項的變量
    #!/usr/bin/env bash # filename: getopts.sh while getopts :abc:e:f:h argvs; docase $argvs ina) echo "這是執行-a的效果" ;;b) echo "這是執行-b的效果" ;;c) echo "這是執行-c的效果及參數值:${OPTARG}" ;;e) echo "這是執行-e的效果及參數值: ${OPTARG}" ;;h) echo "幫助信息"f) echo "這是-f的效果及參數值 ${OPTARG}" ;;[?]) echo "無效或不存在的選項" ;;:) echo "選項缺少參數" ;;esac done
    • 第一個冒號 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`

    可以將命令賦值給變量,變量替換下一個命令
    例子:

    echo ls echo $(ls)

    第一個輸出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命令中的操作指定為空就可以

    trap '' 信號1 信號2

    那么此時如果進程接收到了相關信號,就會進行信號忽略。

    linux三劍客

    基礎正則表達式

    ^(對于每一行以…開頭)

    例子:
    輸出以e打頭的每一行

    [root@VM-101-190-centos ~/dexuantang]# cat test.sh echo $0 echo $1 echo $# echo $@ ls pwd [root@VM-101-190-centos ~/dexuantang]# grep "^e.*" test.sh echo $0 echo $1 echo $# echo $@

    $(對于每一行以…結尾)

    例子:
    輸出以s結尾的行

    [root@VM-101-190-centos ~/dexuantang]# cat test.sh echo $0 echo $1 echo $# echo $@ ls pwd [root@VM-101-190-centos ~/dexuantang]# grep ".*s$" test.sh ls

    ^$(空行)

    常見作用:排除文件中空行

    grep -v "^$" 文件名

    .(任意一個字符)

    例子:
    輸出以s包含exxo的行,x代表任意字符

    [root@VM-101-190-centos ~/dexuantang]# cat test.sh echo $0 echo $1 echo $# echo $@ ls pwd [root@VM-101-190-centos ~/dexuantang]# grep ".*e..o.*" test.sh echo $0 echo $1 echo $# echo $@

    *(前一個字符連續出現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.txt

    grep只支持基礎正則,如果想要進行擴展,只能加-E,
    0+代表0出現了1次或者多次以上。

    一般與[]擦出不一樣的火花
    如:

    grep -E "[0-9]+" test.txt

    匹配出數字

    () 被括起來的內容,表示一個整體(一個字符)

    例子

    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 范圍過濾

    例子:

  • 輸出test.txt的第三行
  • sed -n "3p" test.txt
  • 輸出test.txt的第1-5行
  • sed -n "1,5p" test.txt
  • 輸出test.txt的第4到最后1行
  • sed -n "4,$p" test.txt
  • 輸出test.txt的包含 boy或者girl的行
  • sed -nr "/(boy|girl)/p" test.txt
  • 輸出test.txt的第一個為10:00到最后一個為11:00的行
  • sed -nr "/10:00/,/11:00/p" test.txt

    參數為d,主要功能為刪除某一行,如果想要刪除某個字符,就需要試用到替換

    例子:

  • 刪除test.txt的包含 boy或者girl的行
  • sed -r "/(boy|girl)/d" test.txt
  • 刪除test.txt的第1-5行
  • sed "1,5d" test.txt
  • 刪除文件中空行或者包含#號的行
  • sed -r "^$|#d" test.txt

    增加

    • 參數a append追加,向指定行或者每一行追加內容(后一行)
    • 參數i insert插入,向指定行或者每一行插入內容(前一行)
    • 參數c replace替代,替換這一行的內容

    例子:

  • 在test.txt的包含 boy或者girl的行下追加一行字符串test
  • sed -r "/(boy|girl)/a test" test.txt
  • 在test.txt的第5行前插入一行字符串test
  • sed "5i test" test.txt
  • 替換test.txt的第5行為字符串test
  • sed "5c test" test.txt

    替換

    參數為s
    一般格式:

    s/查找內容正則/替換內容/g

    g代表全局替換,sed默認只替換每一行第一個匹配的內容

    例子:

  • 替換test.txt的oldboy單詞為test
  • sed "s/oldboy/test/g" test.txt

    后向引用(先保護,再引用)

    例子:

  • 在每一行開頭增加 ‘<’ 結尾增加 ‘>’
  • sed -r "s/(.*)/<\1>/g" test.txt

    \1代表獲取()中的內容

  • 替換test.txt的ip為0.0.0.0
  • sed -r "s/([0-9]{1,3}\.){3}[0-9]{1,3}/0.0.0.0/g" test.txt

    總結

    以上是生活随笔為你收集整理的shell用法大全的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。