管道命令總結


管道命令

概念

         管道命令只會處理stdout,忽略stderr

         管道命令后面接的第一個數據必定是命令,這個命令必須能夠接收stdin

雙向重定向

         tee

                   用途:讓stdout轉存一份到文件內,並將同樣的數據繼續送到屏幕處理

                   tee [-a] file

                            a                不加a為>到file,加a為>>到file

[yc@yc temp]$ ls
1.txt
[yc@yc temp]$ cat 1.txt
aaaaa
bbbbb
ccccc
[yc@yc temp]$ cat 1.txt | tee -a tee.log | grep b
bbbbb
[yc@yc temp]$ ls
1.txt  tee.log
[yc@yc temp]$ cat tee.log
aaaaa
bbbbb
ccccc

關於減號-的用途

         用來替代stdin 和stdout

[yc@yc temp]$ ls
a  b
[yc@yc temp]$ ls a
1.txt  2.txt  3.txt
[yc@yc temp]$ ls b
[yc@yc temp]$ tar -cvf - a/ | tar -xvf - -C b/
a/
a/1.txt
a/2.txt
a/3.txt
a/
a/1.txt
a/2.txt
a/3.txt
[yc@yc temp]$ ls b/
a
[yc@yc temp]$ ls b/a/
1.txt  2.txt  3.txt

行的選取命令

  grep

                   用途:分析一行信息,如果當中有我們需要的信息,就將該行拿出來

                  grep [-A] [-B] [-acEinv] [--color=auto] '查找字符串' filename

                            -A            后跟數字n,表after,除了該行,列出其后n行

                            -B            后跟數字n,表before,除了該行,列出其前n行

                           a                將binary文件以text文件的方式查找數據

                            c                 計算找到'查找字符串'的次數

                            E                后跟擴展型正則表達式,一般用egrep代替,詳見正則表達式

                            i                  忽略大小寫

                            n                輸出行號

                            v                 反向選擇,即查找沒有'查找字符串'的那一行

                            --color-auto               將找到的關鍵字顏色顯示

# 查找特定字符串+顯示行號
grep –n ‘the’ regular_express.txt

# 查找非特定字符串+不區分大小寫
ps aux | grep -i tomcat | grep –v grep

# 將關鍵字所在行的前兩行和后三行一起顯示
dmesg | grep –n –A3 –B2 –color=auto 'eth'

                            更多grep命令例子見正則表達式

sed工具

         用途:對數據進行替換、刪除、新增、選取特定行、直接修改文件內容

         sed [-nefr] [n1[,n2]] function

         sed –f [filename]

         set –i [n1[,n2]] function [filename]

                   n       安靜模式,只有選取的那一行會被列出來

                   e       直接在命令行模式上進行sed的動作編輯

                   f        直接將sed的動作寫在一個文件內,-f filename可以執行filename內的sed動作

                   r        sed的動作支持的是擴展型正則表達式的語法,默認基礎型

                   i        直接修改讀取的文件內容,而不是由屏幕輸出

                   n1,n2        代表進行動作的行數,不加代表全部,加則比如10(第10行)或10,20(10-20行)

                   function

                            a       新增,后接字符串,字符串在新的一行出現,目前的下一行

                            c       替換,后接字符串,字符串替換n1和n2之間的行

                            d       刪除,后不跟參數

                            i        插入,后跟字符串,字符串在新的一行出現,目前的上一行

                            p       打印,將選擇的數據打印出來,通常與sed –n一起運行

                            s       替換,后跟正則表達式,替換字符與被替換字符都在動作內包含

# 刪除第2~5行
nl /etc/passwd | sed '2,5d'

# 在第二行后面新增兩行字
nl /etc/passwd | sed '2a Drink tea or\[Enter]drink beer ?'
注:\[Enter]為輸入\后按回車,即可表示新一行的開始’

# 替換第2~5行為”No 2-5 number”
nl /etc/passwd | sed '2,5c No 2-5 number'

# 查看第10~20行
nl /etc/passwd | sed '10,20p'

# 通過s得到目前主機的ip
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

# 直接刪除空白行(不用cat、vim等打開該文件)
sed -i '/^[[:space:]]*$/d' /etc/passwd

# 直接替換文件內字符串(不用cat、vim等打開該文件,適用於大文件的替換)
sed –i 's/https:\/\/www.xxx.com:443/http:\/\/www.yyy.com/g' test.txt

行的排序命令

         sort

                   用途:依據不同的數據類型來排序

                   sort [-fbMnrtuk] [file or stdin]

                            f                 忽略大小寫的差異

                            b                忽略最前面的空格符部分

                            M               以月份的名字來排序

                            n                以純數字排序

                            r                 反向排序

                            t                 分隔符,默認使用[Tab]分隔

                            u                unique,相同的數據只出現一行代表

                            k                 以那個區間來進行排序

# 排序passwd,使用:做分隔符,使用第三列進行排序
cat /etc/passwd | sort -t ':' -k 3

行的統計命令

         wc

                   用途:統計多少字、多少行、多少字符

                   wc [-lwm]

                            l        僅列出多少行

                            w      僅列出多少字(英文單字)

                            m      僅列出多少字符

         uniq

                   用途:相同的數據,僅出現一行代表

                   特殊:可以計數

                   uniq [-ic]

                            i                 忽略大小寫,等效於sort -fu

                            c                 進行計數

數據切割

  cut

                   用途:將一行信息的某一段切出來

                   缺點:處理多空格相連的數據比較差

                   cut -d '分隔字符' -f fields

                            -d               后面接分割字符,與-f一起使用

                            -f                依據-d將一段信息切割成數段,用-f取出第幾段

# 取出PATH的第五個路徑
echo $PATH | cut -d ':' -f 5

# 取出PATH的第三個和第五個路徑
echo $PATH | cut -d ':' -f 3,5

                   cut -c 字符范圍

                            -c               以字符為單位取出固定字符區間

# 取出每一行12個字符之后的所有字符
export|cut -c 12-

# 取出每一行第12~20之間的所有字符
export|cut -c 12-20

  xargs

                   用途:分別通過分割(-i)與分批(-n)行為產生某個命令的參數

                   接收stdin,以指定字符進行分隔,將stdin分成多個arguments

                   主要用於連接兩個非管道命令

                   xargs [-0edpni] command

                            0                將stdin中的特殊字符(如`,\等)還原為一般字符

                            e                后接字符串,表示分析到指定字符串的時候,停止分析(end of file)

                            d                指定分割字符,而不是默認的空格符

                            p                執行每個命令,都會詢問用戶

                            n                指定每次command使用幾個參數

                            i                  不使用i只能傳遞到最后。使用-i后,可以使用{}指定將參數傳遞到哪,也可以多個

[yc@yc temp]$ cut -d ':' -f 1 /etc/passwd| sed -n '1,3p' | xargs -i id {}
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)
uid=2(daemon) gid=2(daemon) groups=2(daemon)

  awk

        用途:以列為單位將一行數據分隔成數個“字段”來處理

        awk ‘條件1{動作1} 條件2{動作2} ...’ filename

   內置變量(可更改)

                      NF   每一行$0擁有的字段總數

                      NR  目前awk所處理的是“第幾行”數據

                      FS   目前的分隔字符,默認空格鍵

                      $0    代表一整行數據

                      $1    代表第一個字段

                      $2    代表第二個字段

                      ...    ...

               關鍵字

                      BEGIN   如果需要更改內置變量(如特殊的分隔字符),內置變量的更改默認情況下從第二行開始,使用BEGIN,代表從第一行之前就開始設置awk的內置變量,適用於特殊分隔字符+第一行也為所需要的數據的情況

                      END              同上,最后一行設置內置變量

        簡單用法:列出某一個字段

# 列出目前活動的進程號(第二個字段)
ps aux | awk ‘{printf $2}’

        高級用法:通過指定條件篩選行與列來得到想要的數據

               使用內置變量+邏輯運算符篩選

                      顯示有4個字段的一整行(NF+邏輯符+$0)

                             cat test.log | awk ‘NF==4{printf $0}’

                      顯示第一行第二個和第四個字段+冒號:分隔符+printf簡單定制(BEGIN+FS+NR+printf的單引號變雙引號;空格變逗號)

                             cat test.log | awk ‘BEGIN {FS=”:”} NR==1{print “%s\t%s”,$2,$4}’

               使用自定義變量+內置變量+邏輯運算符+多條命令作一個動作對數據+printf高級定制進行運算(FS+NR+printf的單引號變雙引號;空格變逗號;分行必須用\n+一個動作中多條命令用;分隔+變量聲明不能用declare -i)

      

                     得到每一行的分數總和

                            cat test.log | awk 'NR==1{printf "%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,"total"} NR>=2{total=$2+$3+$4;printf "%s\t%i\t%i\t%i\t%3.2f\t%i\n",$1,$2,$3,$4,$5,total}'

         

                      得到某一列的分數和

                             declare -i second=0;cat test.log|awk 'NR>=2{second=(second+$3)} NR==4{printf "%i\n",second}'

        

    高級awk用法

      https://www.cnblogs.com/emanlee/p/3327576.html

字符轉換命令

         tr

                   用途:刪除或替換一段信息當中的文字

                   tr [-ds] SET1 ...

                            無參數時進行替換操作

                            d                刪除信息當中的SET1

                            s                 重復的SET1只用一個表示

[yc@yc temp]$ cat a.log
aab,bbc,ccd,dda
AAB,BBC,CCD,DDA
# 小寫變大寫
[yc@yc temp]$ cat a.log | tr '[a-d]' '[A-D]'
AAB,BBC,CCD,DDA
AAB,BBC,CCD,DDA
# 小寫去重復
[yc@yc temp]$ cat a.log | tr -s '[a-d]'
ab,bc,cd,da
AAB,BBC,CCD,DDA
# 小寫變大寫去重復
[yc@yc temp]$ cat a.log | tr -s '[a-d]' '[A-D]'
AB,BC,CD,DA
AB,BC,CD,DA

         col

                   用途:將[Tab]按鍵替換為對等的空格鍵

                   經常用來將man page轉存為純文本文件以方便查閱

                   col [-xb]

                            x                 將[Tab]鍵轉換為對等的空格鍵

                            b                文字內有/時,僅保留/最后接的那個字符

                            例

                                     cat /etc/man.confg|col -x| cat -A| more

                                     man col | col -b > /root/col.man

         join

                   用途:兩個文件當中有相同數據的那一行加在一起

                   注意:兩個文件最好事先經過排序(相同數據那一行)

                   join [-ti12] file1 file2

                            t                 指定分隔符號,默認空格符

                            i                  忽略大小寫

                            1                指定第一個文件用那個字段來分析

                            2                制定第二個文件用哪個字段來分析

                            例

                                     將兩個文件第一個字段相同者整成一行

                                              join -t ':' /etc/passwd /etc/shadow

                                     使用GID將兩個文件整成一行

                                               join -t ':' -1 4 /etc/passwd -2 3 /etc/shadow

                                              注:結果GID會在第一列,其余列按順序排列,相同的前幾個字段不再出現

         paste

                   用途:將兩個文件每一行都粘在一起,[TAB]鍵隔開,不進行匹配,只復制粘貼

                   paste [-d] file1 file2

                            d                后接分隔字符,默認[TAB]

         expand

                   將[TAB]鍵轉換為空格鍵,可以自定義一個[TAB]鍵對應多少個字符

                   expand [-t] file

                            t                 后接數字,默認為8個

         unexpand

                   將空格轉換為[Tab]鍵

                   unexpand [-at] file

                            a                轉換所有空格

                            t                 后接數字,默認為8個

                   unexpand [--first-only] file              僅轉換開頭

文件的相關處理

printf(printf不是管道命令,因為常用與管道命令,所以總結到此)

         用途:將數據輸出的結果格式化

         printf ‘打印格式’ 實際內容

                   \a              警告聲音退出

                   \b              退格鍵

                   \f               清除屏幕

                   \n              輸出新的一行

                   \r               [Enter]鍵

                   \t               水平的[Tab]鍵

                   \v               垂直的[Tab]鍵

                   \xNN         NN為兩位數的數字,可以轉換數字成為字符

                   常見的變量格式

                            %ns           n為數字,s為string,即多少個字符

                            %ni            n為數字,i為integer,即多少整數字數

                            %N.nf       n與N都是數字,f為float,如果有小數字數,%10,2f表示10個整數位,2個小數位

                   例

                            printf '%s\t%s\t%s\t%s\t%s\t\n' $(cat test.txt)

                                     printf不是管道命令,只能用$()先執行獲得stdout

                                     %s表任意長度的字符串,\t表示制表位[Tab]

          

                            printf '%10s %5i %5i %5i %8.2f\n' $(cat test.txt) |grep -v Name

                                     %10s表示10個長度的字符串

                                     %5i表示5個長度的整數

                                     $8.2f表示8個整數位,2個小數位的浮點數

          

                            printf '\x45\n'

                                    列出十六進制45代表的字符--E

文件切割命令

         spilt

                   將一個大文件依據文件大小或行數來切割成為小文件

                   spilt [-bl] file PREFIX

                            b                后接欲切割的單位文件大小,可跟單位,b,k,m等

                            l                  后接欲切割的單位文件行數

                            PREFIX               代表前導符,表示切割成為的文件名字的前幾個字符

                   例

                            cd /tmp ; spilt -b 300k /etc/termcap termcap

                                     得到termcapaa,termcapab,termcapac...

         切割文件的合並

                   cd /tmp ; cat termcap* >> termcapbak

sed其實也算文件處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM