1. 程式人生 > >Linux學習(15)--管道命令

Linux學習(15)--管道命令

管道命令

如果一些資料要經過幾道手續之後才能得到我們想要的格式,應該如何來設定。這就是管道(pipe)命令的問題了,它使用 “|” 這個界定符號。而且管道命令與連續執行命令是不一樣的。

假如我們想知道 /etc 下面有多少檔案,那麼可以利用 ls /etc 來查詢,但是檔案太多,我們不知道前面輸出的內容是什麼,此時我們就可以利用 less 來協助:

[root@mars ~]# ls -al /etc/ | less

這樣的話, ls 命令的輸出內容就能夠被 less 讀取,並且利用 less,我們可以很方便的檢視。其實管道命令“ | ”僅能處理由前面一個命令傳來的正確資訊,也就是 Standard ouput 的資訊,對於 Standard error 並沒有處理能力。

管道命令

  • 管道命令僅會處理 standard output,對於standard error 會被會略
  • 管道命令必須要能夠接收來自前一個命令的資料成為 standard input 繼續處理才行

所以,ls、cp、mv之類的命令就不能放在中間執行,因為他們不會接收來自前一個命令的 stdout。

選取命令:cut,grep

cut

範例1:將 PATH 變數取出,找出第五個路徑
[root@mars ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#    1          |      2      |     3    |   4    |    5
[root@mars ~]# echo $PATH | cut -d ':' -f 5 #如果上面的數字顯示,我們是以“:”為分隔符,因此會出現 /root/bin #如果要列出第 3 和第 5 就是這樣的 [root@mars ~]# echo $PATH | cut -d ':' -f 3,5

當然,不僅僅是這樣,我們完全還可以選取每一行的內容,比如:

[[email protected] tmp]# export 
declare -x HISTSIZE="3000"
declare -x HISTTIMEFORMAT="%F %T "
declare -x HOME="/root"
declare -x HOSTNAME="mars" declare -x LANG="C" ...下面省略... #我們可以發現,所有資料都是排列整齊輸出的,如果我們不想要每行的“declare -x”,可以這樣 [[email protected] tmp]# export | cut -c 12- HISTSIZE="3000" HISTTIMEFORMAT="%F %T " HOME="/root" HOSTNAME="mars" LANG="C" ...下面省略... #我們還可以指定某個範圍的值,比如 cut -c 12-20

grep

grep 是分析一行資訊,若當中有我們需要的資訊,就將該行拿出來,基本語法如下所示:

[[email protected] ~]# grep [-acinv] [--color=auto] '查詢字串' filename
選項與引數:
-a:將 binary 檔案以 text 檔案的方式查詢資料
-c:計算找到 '查詢字串' 的次數
-i:忽略大小寫
-n:順便輸出行號
-v:反向選擇,即顯示出沒有 '查詢字串' 的那一行
--color=auto:可以將找到的關鍵字部分加上顏色顯示


範例1:將 last 中有出現 root 的那一行取出來
[[email protected] ~]# last | grep 'root'

範例2:在 last 的輸出資訊中,只要有 root 就取出,並且進取第一列
[[email protected] ~]# last | grep 'root'| cut -d ' ' -f1

範例3:取出 /etc/man_db.conf 內含 MANPATH 的那幾行
[[email protected] ~]# grep --color=auto 'MANPATH' /etc/man_db.conf 
# MANDATORY_MANPATH         manpath_element
# MANPATH_MAP       path_element    manpath_element
# every automatically generated MANPATH includes these fields
#MANDATORY_MANPATH          /usr/src/pvm3/man
MANDATORY_MANPATH           /usr/man
MANDATORY_MANPATH           /usr/share/man
MANDATORY_MANPATH           /usr/local/share/man
# set up PATH to MANPATH mapping
#       *PATH*        ->    *MANPATH*
MANPATH_MAP /bin            /usr/share/man

#找到的加上color的選項,找到都會用特殊顏色顯示

排序命令:sort,wc,uniq

sort

排序的字元與語系的編碼有關,因此如果你需要排序,建議設定 LANG=C 來統一。

[[email protected] ~]# sort [-fbMnrtuk] [file or stdin]
選項與引數:
-f:忽略大小寫
-b:忽略最前面的空格
-M:以月份來排序
-n:私用“純數字”來排序
-r:反向排序
-u:就是uniq,相同的資料只出現一行代表
-t:分隔符,預設使用[Tab]來分隔
-k:以那個區間(field)來排序


範例1:排序個人賬號記錄
[[email protected] ~]# cat /etc/passwd | sort

範例2:/etc/passwd 的記錄都是以 : 分隔的,我想以第三列來排序
[[email protected] ~]# cat /etc/passwd | sort -t ':' -k 3
#但是第三列排序的數字有點奇怪,因為它預設是文字排序,若需要數字
#這麼寫:cat /etc/passwd | sort -t ':' -k 3 -n

範例3:利用 last 將輸出的資料僅選取賬號,並排序
[[email protected] ~]# last | cut -d ' ' -f1 | sort

uniq

如果排序完成了,想將重複的資料僅列出一個顯示,可以怎麼做?

[root@mars ~]# uniq [-ic]
選項與引數:
-i:忽略大小寫
-c:進行計數


範例1:用 last 取出賬號列,進行排序後僅取出一位,並計數
[root@mars ~]# last | cut -d ' ' -f1 | sort | uniq -c
      1 
      1 reboot
     96 root
      1 wtmp
#第一行的空白字元和wtmp都是 last 的預設字元,可忽略

wc

如果我想知道 /etc/man_db.conf 這個檔案裡面有多少字?多少行?可以怎麼做?

[root@mars ~]# wc [-lwm]
選項與引數:
-l:僅列出行
-w:僅列出多少字(英文單字)
-l:多少字元


範例1:檢視 /etc/man_db.conf 裡面多少相關字、行、字元
[root@mars ~]# cat /etc/man_db.conf | wc
    131     723    5171

範例2:如何以一行命令取得這個月份登入系統的總人次
[root@mars ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
#由於last會輸出空白行和 wtmp,我們利用grep取出,再計算行數

雙向重定向:tee

tee

tee 會同時將資料流送到檔案和螢幕;而輸出到螢幕的,其實就是 stdout,可以讓下個命令繼續處理

[root@mars ~]# tee [-a] file
選項與引數:
-a:以累加(append)的方式,將資料加入 file

[root@mars ~]# last | tee last.list | cut -d " " -f1
#讓我們可以將 last 輸出存一份到 last.list 檔案中

[root@mars ~]# ls -l /etc/ | tee ~/homefile | more
#將 ls 資料存到 ~/homefile,同時螢幕輸出

切割命令:split

如果有檔案太大,導致一些便攜裝置無法複製,這個時候就可以用split

[[email protected] ~]# split [-bl] file PREFIX
選項與引數:
-b:後面接想切割成的檔案大小,單位:b,k,m等
-l:以行數來進行切割
PREFIX:代表前導符,可作為切割檔案的前導文字

範例1:/tmp/etc.tar.bz2 有6.1M,若想分成 3M 一個檔案怎麼辦
[[email protected] /]# cd /tmp/; split -b 3m /tmp/etc.tar.bz2 etc
[[email protected] tmp]# ll -k etc*
-rw-r--r-- 1 root root 6341666 Mar 13 16:35 etc.tar.bz2
-rw-r--r-- 1 root root 3145728 Mar 13 16:37 etcaa
-rw-r--r-- 1 root root 3145728 Mar 13 16:37 etcab
-rw-r--r-- 1 root root   50210 Mar 13 16:37 etcac
#我們只要寫上前導文字,小檔案就會以
#xxxaa,xxxab,xxxac等方式來新建小檔案


範例2:如何合併?檔名為 etcback
[[email protected] tmp]# cat etca* >> etcback
#直接資料流重定向

關於減號 - 的用途

在管道命令中,經常會使用前一個命令的 stdout 作為後面的 stdin,某些時候,我們可以用減號“ - ”來代替:

[root@mars tmp]# tar -cvf - /home | tar -xvf -

我們將/home 的檔案打包,但是不是記錄到檔案,而是傳送到 stdout,經過管道,傳給後面的tar -xvf -,因此我們就不要檔案了,這是很常見的。

#將ls -al 的資訊輸出,每10個記錄一個檔案
[root@mars tmp]# ls -al / | split -l 10 - lstmp
[root@mars tmp]# wc -l lstmpa*
  10 lstmpaa
  10 lstmpab
   6 lstmpac
  26 total

相關推薦

Linux學習15--管道命令

管道命令 如果一些資料要經過幾道手續之後才能得到我們想要的格式,應該如何來設定。這就是管道(pipe)命令的問題了,它使用 “|” 這個界定符號。而且管道命令與連續執行命令是不一樣的。 假如我們想知道 /etc 下面有多少檔案,那麼可以利用 ls /etc

Linux學習——其他命令

其他命令 目標 查詢檔案 find 軟連結 ln 打包和壓縮 tar 軟體安裝 apt-get 01. 查詢檔案 find 命令功能非常強

Linux學習命令基本使用

文章目錄 常用Linux命令的基本使用 1.`cd` 切換資料夾(change directory) 2.`pwd` 檢視當前目錄所在路徑(print wrok directory) 3.`ls` 檢視當前目錄內容(list)

Linux學習——系統資訊相關命令

系統資訊相關命令 本節內容主要是為了方便通過遠端終端維護伺服器時,檢視伺服器上當前 系統日期和時間 / 磁碟空間佔用情況 / 程式執行情況 本小結學習的終端命令基本都是查詢命令,通過這些命令對系統資源的使用情況有個瞭解 目標 時間和日期 date

Linux學習——使用者許可權相關命令

使用者許可權相關命令 01. 使用者 和 許可權 的基本概念 1.1 基本概念 使用者 是 Linux 系統工作中重要的一環,使用者管理包括 使用者 與 組 管理 在 Linux 系統中,不論是由本機或是遠端登入系統,每個系統都必須擁有一個賬號,並且對於不同的系統資源擁有不同

Linux學習——常用的遠端管理命令

遠端管理常用命令 目標 關機/重啟 shutdown 檢視或配置網絡卡資訊 ifconfig ping 遠端登入和複製檔案 ssh scp 01. 關機/重啟

Linux學習——常用檔案管理命令

一. 常用 Linux 命令的基本使用 序號 命令 對應英文 作用 01 ls list 檢視當前資料夾下的內容 02 pwd

Linux學習————Linux常用命令

系統關機 shutdown -h now 關閉系統 init 0 關閉系統 telinit 0 關閉系統 shutdown -h hours:minutes & 按預定時間關閉系統 shutdown -c

Linux命令學習6 head命令詳解

head 顯示文字頭部內容 head命令的作用就像它的名字一樣,用於顯示檔案的開頭部分文字。 使用方式 [[email protected] ~]# head [-n number] 檔案 選項與引數: -n :後面接數字,代表顯示幾行的意思 [[e

Linux學習:其他命令

文章目錄 `which` 檢視命令位置 `su` 切換賬號 `passwd` 重置密碼 `exit` 退出當前使用者 `who` 檢視當前登入的客戶端,或者當前登入的命令終端 `reboot、shutdown` 重啟

Linux學習管道和連結

管道和連結 1.|管道 ls -l / | more 一個命令的輸出可以通過管道交給另一個命令的輸出 2.ln連結 軟連結:軟連結不佔用磁碟空間,原始檔刪除則軟連結失效。 ln -s 原始檔 連

linux學習9命令與檔案的搜尋which,whereis,locate,find

命令與檔案的搜尋: 檔案的搜尋可就厲害了!因為我們常常需要知道那個檔案放在哪裡,才能夠對該檔案進行一些修改或維護等動作。有些時候某些軟體配置檔的檔名是不變的,但是各 distribution 放置的目錄則不同。此時就得要利用一些搜尋命令將該配置檔的完整檔名捉出來 命令檔名的

空閒時間學一個Linux命令15—— tail 命令

tail 命令從指定點開始將檔案寫到標準輸出.使用tail命令的-f選項可以方便的查閱正在改變的日誌檔案,tail -f filename會把filename裡最尾部的內容顯示在螢幕上,並且不但重

Linux學習1

linux開始學習Linux了,希望能學有所成————測試中本文出自 “Linux學習” 博客,請務必保留此出處http://mmchy.blog.51cto.com/13044974/1941714Linux學習(1)

Shiro學習15單點登錄

XML init mage oid login plugin void keystore .com Shiro 1.2開始提供了Jasig CAS單點登錄的支持,單點登錄主要用於多系統集成,即在多個系統中,用戶只需要到一個中央服務器登錄一次即可訪問這些系統中的任何一個,無須

Linux學習之內核、系統調用、庫

all mic linu windows系統 文件 .dll 執行 lin win   這篇博客主要介紹Linux中幾個常見的概念      Kernal:內核:我們知道計算機的硬件包括:cpu、內存、外存等等 系統想要統一資源分配就需要用到內核!內核是將計算機的硬件資源抽

linux學習——湯哥的推薦書籍

最終 對比 2.6 win 程序開發 經驗 專業 linux 操作 面試題目 成為一名精通 Linux程序設計的高級程序員一直是不少朋友孜孜以求的目標。 根據中華英才網統計數據,北京地區 Linux 程序員月薪平均為 Windows程序員的 1.8 倍、Java 程序員

linux學習——學習之路

tcp/ip 阻塞 結合 調度 了解 選擇 博客園 要去 事情 首先,要學Linux編程,你得會用Linux,也就是得在命令行環境下生存下來。什麽叫生存下來呢?就是我現在給你一臺主機,鍵盤,顯示器啥的,然後給你一個服務器版的Linux系統的光盤或者其他什麽安裝盤,你去把這臺

linux學習linux配置網卡以及常見網絡問題排查

library ifconf netmask logs 切換網絡 peer local 但是 src 實驗環境環境:mac,vmware fusion 一、常用的虛擬機網絡連接模式。 NAT:推薦方式。它可以使你在切換網絡環境(比如在工作中和家裏)時,不需要修改虛擬主機的配

linux學習絕對路徑、相對路徑、cd、mkdir、rmdir、rm

director shell script local mkdir -p create deb blog 目錄 一、絕對路徑 就是從根開始的,如:/root、/usr/local。 二、相對路徑 相對於當前路徑的,比如我們在當前路徑下建立了一個a.txt。 [root@i