1. 程式人生 > >Linux管道的作用--管道命令在指令碼中的使用

Linux管道的作用--管道命令在指令碼中的使用



UNIX下的管理性檔案,大部分是不需要特殊的檔案專用工具即可編輯,列印和閱讀的簡易文字檔案。

這些檔案大部分放在標準目錄:/etc下。如:

常見的密碼檔案和組檔案:(passwd,group)

檔案系統載入表:(fstab,vfstab)

主機檔案:(hosts)

預設的shell啟動檔案:(profile)

系統啟動和關機的shell指令碼:(存放於子目錄樹rc0.d,rc1.d ... rc6.d)

從結構化文字檔案中提取資料

練習1:切割passwd下第一,第七欄位

[[email protected] ~]$ vi patest.sh

#!/bin/bash

umask 077

PERSON=/tmp/pd.key.person.$$

OFFICE=/tmp/pd.key.office.$$

TELEPHONE=/tmp/pd.key.telephone.$$

USER=/tmp/pd.key.user.$$

trap "exit 1" HUP INT PIPE QUIT TERM

trap "rm -f $PERSON $OFFICE $TELEPHONE $USER " EXIT

awk -F: '{ print $1 ":" $7 }' /etc/passwd > $USER

awk -F: '{ print $1}' < $USER | sort >$PERSON

sed -e 's=^\([^:]*\):[^/]*/\([^/]*\)/.*$=\1:\2=' < $USER | sort >$OFFICE

sed -e 's=^\([^:]*\):[^/]*/[^/]*/\([^/]*\)=\1:\2=' < $USER | sort >$TELEPHONE

join -t: $PERSON $OFFICE |

join -t: - $TELEPHONE |

sort -t: -k1,1 -k2,2 -k3,3 |

awk -F: '{ printf("%-39s\t%s\t%s\n", $1,$2,$3) }'

[gz_fieldyang

@test ~]$ chmod +x patest.sh

[[email protected]test ~]$ bash +x patest.sh

adm sbin nologin

alert2system bin bash

alert2systemtest bin bash

avahi sbin nologin

bin sbin nologin

cvsroot bin bash

dbus sbin nologin

dovecot sbin nologin

ftp sbin nologin

ftpuser bin bash

games sbin nologin

gdm sbin nologin

git_test usr local/git/bin/git-shell

gopher sbin nologin

gup sbin nologin

....

練習2 如果/etc/passwd 下第五欄位包含姓名,辦公室號碼,電話等,

如下文件,試建立辦公室名錄

[[email protected] ~]$ vi passwd1

gz_willwu:x:843:843:Will wu/SN091/555-6728:/home/gz_willwu:/bin/bash

ninf_thomaschan:x:853:853:Thomas chan/INF002/554-4565:/home/sninf_thomaschan:/bin/bash

llwu:x:843:843:Will wu/SN091/555-6728:/home/gz_willwu:/bin/bash

sninf_thomaschan:x:853:853:Thomas chan/INF002/554-4565:/home/sninf_thomaschan:/bin/bash

sninf_tonyhung:x:856:856:Tonny huang/HK0501/553-6465:/home/sninf_tonyhung:/bin/bash

gz_kinma:x:857:857:Kin ma/SN021/555-6733:/home/gz_kinma:/bin/bash

gz_fieldyang:x:859:859:Field yang/SN001/555-6765:/home/gz_fieldyang:/bin/bash

gz_hilwu:x:843:843:hil wu/SN021/555-6744:/home/gz_willwu:/bin/bash

步驟解析:

[[email protected] ~]$ awk -F: '{ print $1 ":" $5 }' passwd1 |

> sed -e 's=/.*==' -e 's=^\([^:]*\):\(.*\) \([^ ]*\)=\1:\3, \2='

ninf_thomaschan:chan, Thomas

llwu:wu, Will

sninf_thomaschan:chan, Thomas

sninf_tonyhung:huang, Tonny

gz_kinma:ma, Kin

gz_fieldyang:yang, Field

gz_willwu:wu, Will

# ^\([^:]*\) 匹配使用者名稱稱欄位,如gz_willwu

# \(.*\) 匹配文字到空白處,如willwu

# \([^ ]*\) 匹配剩下的非空白處,如will

# \1:\3, \2 引用第一個左括號匹配到的內容:第三個左括號匹配到的內容, 第二個左括號匹配到的內容

#結果如 sninf_thomaschan:chan, Thomas

[[email protected] ~]$ awk -F: '{ print $1 ":" $5 }' passwd1 |

> sed -e 's=^\([^:]*\):[^/]*/\([^/]*\)/.*$=\1:\2='

ninf_thomaschan:INF002

llwu:SN091

sninf_thomaschan:INF002

sninf_tonyhung:HK0501

gz_kinma:SN021

gz_fieldyang:SN001

gz_willwu:SN091

[[email protected] ~]$ awk -F: '{ print $1 ":" $5 }' passwd1 |

> sed -e 's=^\([^:]*\):[^/]*/[^/]*/\([^/]*\)=\1:\2='

ninf_thomaschan:554-4565

llwu:555-6728

sninf_thomaschan:554-4565

sninf_tonyhung:553-6465

gz_kinma:555-6733

gz_fieldyang:555-6765

gz_willwu:555-6728

實際執行指令碼如下:建立辦公室名錄的指令碼

[[email protected] ~]$ vi patest.sh

#!/bin/bash

# 過濾/etc/passwd之類的輸入流

#並以此書庫衍生出辦公室名錄

#

#

umask 077

PERSON=/tmp/pd.key.person.$$

OFFICE=/tmp/pd.key.office.$$

TELEPHONE=/tmp/pd.key.telephone.$$

USER=/tmp/pd.key.user.$$

trap "exit 1" HUP INT PIPE QUIT TERM

trap "rm -f $PERSON $OFFICE $TELEPHONE $USER " EXIT

awk -F: '{ print $1 ":" $5 }' passwd1 > $USER

sed -e 's=/.*==' \

# s=/.*== 刪除第一個/後直至行結尾所有內容,擷取後結果如gz_willwu:Will wu

-e 's=^\([^:]*\):\(.*\) \([^ ]*\)=\1:\3, \2=' < $USER | sort >$PERSON

sed -e 's=^\([^:]*\):[^/]*/\([^/]*\)/.*$=\1:\2=' < $USER | sort >$OFFICE

sed -e 's=^\([^:]*\):[^/]*/[^/]*/\([^/]*\)=\1:\2=' < $USER | sort >$TELEPHONE

join -t: $PERSON $OFFICE |

#結合個人資訊與辦公室位置

join -t: - $TELEPHONE |

#加入電話號碼

cut -d: -f 2- |

#刪除鍵值,使用cut擷取欄位2直至結束

sort -t: -k1,1 -k2,2 -k3,3 |

# 以:分隔欄位,依次對欄位1,2,3進行排序

awk -F: '{ printf("%-39s\t%s\t%s\n", $1,$2,$3) }'

#重新格式化輸出

附:

$# 是傳給指令碼的引數個數

$0 是指令碼本身的名字

$1 是傳遞給該shell指令碼的第一個引數

$2 是傳遞給該shell指令碼的第二個引數

[email protected] 是傳給指令碼的所有引數的列表

$* 是以一個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,引數可超過9

$$ 是指令碼執行的當前程序ID

$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

[[email protected] ~]$ ./patest2.sh

chan, Thomas INF002 554-4565

chan, Thomas INF002 554-4565

huang, Tonny HK0501 553-6465

ma, Kin SN021 555-6733

wu, hil SN021 555-6744

wu, Will SN091 555-6728

yang, Field SN001 555-6765

[[email protected] ~]$

練習3:建立一個指令碼,查詢匹配調節的特定文字

[[email protected] ~]$ vi puzzle-help.sh

#!/bin/bash

#通過一堆單詞列表,進行模式匹配

#語法: ./puzzle-help.sh egrep-pattern [word-list-file]

FILES="/usr/share/dict/words

/usr/dict/words

/usr/share/lib/dict/words

/usr/local/share/dict/words.biology

/usr/local/share/dict/words.chemistry

/usr/local/share/dict/words.general

/usr/local/share/dict/words.knuth

/usr/local/share/dict/words.latin

/usr/local/share/dict/words.manpages

/usr/local/share/dict/words.mathematics

/usr/local/share/dict/words.physics

/usr/local/share/dict/words.roget

/usr/local/share/dict/words.sciences

/usr/local/share/dict/words.UNIX

/usr/local/share/dict/words.webster

"

#FILES變數儲存了單詞列表檔案的內建列表,可供各個本地站點定製

pattern="$1"

egrep -h -i "$pattern" $FILES 2>/dev/null | sort -u -f

#grep -h :指示最後結果不要顯示檔名,-i:表示忽略大小寫

#sort -u :只有唯一的記錄,丟棄所有具相同鍵值的記錄

#sort -f :排序時忽略大小寫,均視為大寫字母

[[email protected] ~]$ ./puzzle-help.sh '^b.....[xz]...$' | fmt

Babelizing bamboozled bamboozler bamboozles baronizing Bellinzona

Belshazzar bigamizing bilharzial Birobizhan botanizing Brontozoum

Buitenzorg bulldozers bulldozing

#匹配b開頭,中間任意五個字元,加上x/z,再加任意三個字元

[[email protected] ~]$ ./puzzle-help.sh '[^aeiouy]{7}' /usr/dict/words |fmt

2,4,5-t A.M.D.G. arch-christendom arch-christianity A.R.C.S.

branch-strewn B.R.C.S. bright-striped drought-stricken earth-sprung

earth-strewn first-string K.C.M.G. latch-string light-spreading

light-struck Llanfairpwllgwyngyll night-straying night-struck

Nuits-St-Georges pgnttrp R.C.M.P. rock-'n'-roll R.S.V.P. scritch-scratch

scritch-scratching strength-bringing substrstrata thought-straining

tight-stretched tsktsks witch-stricken witch-struck world-schooled

world-spread world-strange world-thrilling

# 找出每行7個子音字母的英文單詞

[[email protected] ~]$ ./puzzle-help.sh '[^aeiouy]{8}' /usr/dict/words |fmt

B.R.C.S. K.C.M.G. R.C.M.P. rock-'n'-roll R.S.V.P.

[[email protected] ~]$ ./puzzle-help.sh '[aeiouy]{6}' /usr/dict/words |fmt

AAAAAA euouae

# 找出每行6個母音字母的英文單詞

[[email protected] ~]$ ./puzzle-help.sh '[aeiouy]{5}' /usr/dict/words |fmt

AAAAAA Aeaea Aeaean AIEEE ayuyu Bayeau Blueeye cadiueio Chaouia cooeeing

cooeyed cooeying euouae fooyoung gayyou Guauaenok Iyeyasu Jayuya

Liaoyang Mayeye miaoued miaouing Pauiie queueing Taiyuan taoiya theyaou

trans-Paraguayian ukiyoye Waiyeung

[[email protected] ~]$

練習4:試建立一個指令碼,作為單詞出現頻率過濾器

[[email protected] ~]$ vi wf.sh

#!/bin/bash

#從標準輸入流讀取文字流,在輸出出現頻率最高的前n個單詞的列表

#附上出現頻率的計數,按照這幾計數由大到小排列

#輸出到標準輸出

#語法 ./wf [n] < file

#

tr -cs A-Za-z\' '\n' |

#將非字母字元置換成換行符號,相當於:

# tr -cs [^[A-Za-z] '\n'

tr A-Z a-z |

sort |

uniq -c |

#去除重複,並顯示其計數

sort -k1,1nr -k2 |

#計數由大到小排序後,再按單詞由小到大排序

#sort -k:定義排序鍵值欄位,按照那個欄位(file)進行排序

#sort -n :依照數值的大小排序

#sort -r :以相反的順序來排序,由大到小

# sort -k1,1nr :表示從欄位1起始處開始,以數值型別反向排序,並結束與欄位1的結尾

sed ${1:-25}q

#顯示前n行,預設為25

[[email protected] ~]$ vi test #隨意擷取文段建立測試檔案

Patent interference cases are historically rare; but they’ve become basically

non-existent since a change in the patent law in 2013. Today, patents are

awarded on a “first to file” basis. However, prior to 2013, patents were granted

on a “first to invent” basis, meaning whoever could prove they invented the idea

first would have rights to the patent. Since Doudna’s and Zhang’s patents were filed

before the switch went into effect, the case falls under the “first to invent” standard.

In the past, patent interference cases like this were concluded within a year,

Sherkow said, but given the value of this patent, it seems more than likely that

the losing party will appeal the decision. That process could stretch out for years.

測試例項:

①、預設情況下格式化輸出

[[email protected]est ~]$ ./wf.sh < test | pr -c4 -t -w80

10 the 3 were 2 interferenc 2 they

5 patent 2 are 2 invent 2 this

5 to 2 basis 2 on 1 and

4 a 2 but 2 s 1 appeal

4 first 2 cases 2 since 1 awarded

3 in 2 could 2 that 1 basically

3 patents

#pr -cn:產生n欄的輸出 可縮寫為-n

#pr -t:不顯示標題

#pr -wn:每行至多n個字元

②、擷取前面12行後格式化輸出

[[email protected] ~]$ ./wf.sh 12 < test | pr -c4 -t -w80

10 the 4 a 3 patents 2 basis

5 patent 4 first 3 were 2 but

5 to 3 in 2 are 2 cases

③、算出去除重複行後有多少單詞出現

[[email protected] ~]$ ./wf.sh 9999 < test | wc -l

82

[[email protected] ~]$ ./wf.sh 9999 < test | wc -w

164

[[email protected] ~]$ ./wf.sh 999 < test | wc -c

1153

# wc -l:計算行數 -c:計算位元組數 -w:計算字數

④、擷取最不常見的出現的單詞

[[email protected] ~]$ ./wf.sh 999 < test | tail -n -12 | pr -c4 -t -w80

1 today 1 ve 1 will 1 year

1 under 1 went 1 within 1 years

1 value 1 whoever 1 would 1 zhang

⑤、計算出測試文件中出現一次的單詞個數

[[email protected] ~]$ ./wf.sh 999 < test | grep -c '^ *1.'

62

#接在數字1後的.表示的是製表字元(Tab),引數999無意義,可任意取大於文件字數的數字

#grep -c:統計每個檔案匹配的行數

⑥、計算出經常出現的核心單詞個數

[[email protected] ~]$ ./wf.sh 999 < test | awk '$1 >=3' | wc -l

8

[[email protected] ~]$

相關推薦

Linux Crontab執行hadoop命令指令碼失敗

   最近在寫一個Hadoop系列操作的排程指令碼,由crontab排程執行。指令碼單獨執行沒有任何問題,但是一旦執行hadoop相關操作,如hive、Hadoop相關命令,就莫名其妙的失敗。查了很多資料,後來才發現是環境變數的問題,需要在指令碼中新增“source /et

Linux管道作用--管道命令指令碼的使用

 在UNIX下的管理性檔案,大部分是不需要特殊的檔案專用工具即可編輯,列印和閱讀的簡易文字檔案。 這些檔案大部分放在標準目錄:/etc下。如: 常見的密碼檔案和組檔案:(passwd,group)

Linux Shell基礎 管道符和grep命令

概述 管道符:管道符使用"丨"代表。如"命令1丨命令2"。表示命令 1 的正確輸出作為命令 2 的操作物件。命令 1 必須有正確輸出,而命令 2 必須可以處理命令 1 的輸出結果。 grep命令:在檔案中提取和匹配符合條件的字串行。 管道符 1. 在使用"||"命令査看/etc/ 目錄時顯示的內容非常

linux的shell指令碼執行多個命令的方法

第一種是以分號(;)進行劃分:表示:各命令的執行的果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。 第二種命令之間&&隔開 表示:若前面的命令執

Unix/Linux指令碼"set -e"的作用

有些指令碼中會看到這樣的語句:#!/bin/bash set -e command 1 command 2 ... exit 0“set -e” 這句語句告訴bash如果任何語句的執行結果不是true則應該退出。這樣的好處是防止錯誤像滾雪球般變大導致一個致命的錯誤,而這些錯

linux下shell指令碼sed命令使用變數

用linpack做測試,寫了一個指令碼, 因為每次可修改的引數寫在了配置檔案裡,所以腳本里用sed命令來修改配置檔案#測試次數echo “Input Number of tests:”read numt#每次測試的資料規模,測試次數有多少次,這裡應該又多少組數字,中間以空格隔

滲透之——作業系統支援的管道符(在命令執行漏洞常用)

轉載請註明出處:https://blog.csdn.net/l1028386804/article/details/85919481 在滲透過程中,有些系統或程式存在命令執行漏洞,那麼這時我們就可以依照作業系統支援的管道符來執行我們新增的一些系統命令,這裡,就Windows和Linux支援的

如何在linux命令列(非指令碼)迴圈執行命令------相見恨晚的watch命令

       無論是linux開發, 測試還是運維, 很多時候, 我們需要監控狀態的動態變化, 比如, 要看記憶體的使用情況, 可以用free命令, 但問題是, 必須每次手動不停地去執行。 有的朋友可能說, 用top啊。 這樣確實可以, 但是, 很多時候並沒有動態命令, 貌

Linux shell指令碼執行命令結果賦值給變數&&echo輸出變數是否包含換行符的問題

Linux shell指令碼中執行命令結果賦值給變數&&echo輸出變數是否包含換行符的問題 echo $ret 和 echo "$ret" 區別: 如果是echo $ret,輸出結果為一行,沒有換行符 如果是echo "$ret",輸出結果為多行,有換行符

linux shell指令碼cd命令無效的解決方法

      今天需要快速切換目錄,然後在sh腳本里面加入cd,但發現執行後無效。原因就不深究了。然後查了一下,有三種解決方案。       方案一、source ./    格式   例如:so

指令碼或者linux下使用iconv命令將utf_8和gbk以及gb2312的相互轉換

1.轉換gbk編碼檔案為utf-8編碼檔案 iconv -f gbk -t utf-8 aa.txt > aa.bak 其中-f指的是原始檔案編碼,-t是輸出編碼 aa.txtl是原始檔案 aa.bak是輸出結果檔案 iconv -c --v

Linux每天學習一個命令管道命令(pipe)

之前學習命令的時候使用了管道命令,只知道如何使用,不是十分清楚其使用規則,決定學習總結一下管道的使用 什麼是管道:管道就是用 | 連線兩個命令,以前面一個命令的標準輸出作為後面命令的標準輸入,與連續

linux中用無名管道進行文件的讀寫

lin nbsp 例子 erro images 是什麽 管道 linux mage 1管道是什麽:   水管子大家知道,有兩端,在此一端用來讀一端用來寫,其中一端的輸出作為另外一端的輸入。 2 函數原型   int pipe(int pipefd[2]);//參數中分別代表

linux的網絡命令整理 更新

net-tools 與 iproute包linux的網絡命令整理 更新中1.安裝包:net-tools 主要命令: netstat , ifconfig , route , iptunneliproute 主要命令: ss , ip addr , ip route , ip tunnel 2.net-t

linux之無名管道

操作 char fork stdio.h 緩沖 stdin fgets 打開 open 1、查看命令: man 2 pipe 2.頭文件:#include <unistd.h> 3、函數原型: int pipe(int pipefd[2]); a、pipef

特殊符號、與管道相關的命令

ada pro roc color water cdb log ces e30 與管道相關的命令 特殊符號 特殊符號、與管道相關的命令

Linux系統管理初步(二)io、free、ps、netstat命令 編輯

sha 系統 工具 可能 工作 ued uri per str 10.6 監控io性能10.7 free命令10.8 ps命令10.9 查看網絡狀態10.10 linux下抓包 一、iostat與iotop命令 iostat命令與iotop,命令能夠看出系統磁盤的工作情況,

Linux命令排版格式的一個好用的命令

column1、需求場景 在輸入Linux命令的時候,想要字符界面顯示類似於表格一樣的排版。 2、語法說明 用法: column [選項] [文件 ...] 選項: -c, --columns <寬度> 輸出寬度(字符數) -t, --table 創建表格

Mac下如何用SSH連接遠程Linux服務器及Linux一些常用操作命令,更新.....

oot .... 地址 密碼 res ini 更新 目錄 讀寫 1、 終端命令   a).打開Mac的命令終端   b).輸入ssh -p 22 [email protected] 它會提示你輸入密碼,輸入正確的密碼之後,你就發現已經登陸成功了.(22: 端口號 roo