管道命令
概念
管道命令只會處理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