常用 linux 命令集錦
文章涉及到vim\grep\cat\more\less\echo\sed\awk的入門用法。
vim:
vim test -----建立一個(gè)test文件。test文件可以是hello.py、hello.txt等。
touch test -----效果同vim test。
mkdir test -----建立一個(gè)test文件夾
open test -----打開test文件夾
rm test ----- 刪除test文件
rm -r test -----刪除test文件夾
注意:vim test 命令后會(huì)進(jìn)入vim編輯器,按鍵i,進(jìn)入編輯模式,按鍵esc,退出編輯模式,鍵入:x,(注意是':x')保存編輯并退出。
grep:
文本搜索工具,可搭配正則表達(dá)式使用,全稱Global Regular Expression Print,譯為全局正則表達(dá)式版本。
grep的一般使用方法:grep+[options]+pattern+filename? ,其中pattern是要搜索的字符串或正則表達(dá)式。
options可選參數(shù):
-i :忽略大小寫
? ? -c :打印匹配的行數(shù)
? ? -l :從多個(gè)文件中查找包含匹配項(xiàng)
? ? -v :查找不包含匹配項(xiàng)的行
? ? -n:打印包含匹配項(xiàng)的行和行標(biāo)
正則表達(dá)式參數(shù):
\ 忽略正則表達(dá)式中特殊字符的原有含義
? ? ^ 匹配正則表達(dá)式的開始行
? ? $ 匹配正則表達(dá)式的結(jié)束行
? ? \< 從匹配正則表達(dá)式的行開始
? ? \>; 到匹配正則表達(dá)式的行結(jié)束
? ? [ ] 單個(gè)字符;如[A] 即A符合要求
? ? [ - ] 范圍 ;如[A-Z]即A,B,C一直到Z都符合要求
? ? . 所有的單個(gè)字符
? ? * 所有字符,長度可以為0
其他:
明確要求搜索子目錄(-r的意思是遞歸):grep -r
? ? 或忽略子目錄:grep -d skip
注意:grep 是搜索文件內(nèi)容的,不搜索文件名。
如果有很多 輸出時(shí),您可以通過管道將其轉(zhuǎn)到'less'上閱讀:
? ? $ grep magic /usr/src/Linux/Documentation/* | less
常見的示例有:
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找關(guān)鍵詞"Aug"
? ? grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"開始的詞匯
? ? grep [0-9] /var/log/messages 選擇 '/var/log/messages' 文件中所有包含數(shù)字的行
? ? grep Aug -R /var/log/* 在目錄 '/var/log' 及隨后的目錄中搜索字符串"Aug"
在Linux系統(tǒng)中有三種命令可以用來查閱全部的文件,分別是cat、more和less命令。它們查閱文件的使用方法也比較簡(jiǎn)單都是 命令 文件名 ,但是三者又有著區(qū)別。
1.cat命令可以一次顯示整個(gè)文件,如果文件比較大,使用不是很方便;
2.more命令可以讓屏幕在顯示滿一屏幕時(shí)暫停,此時(shí)可按空格健繼續(xù)顯示下一個(gè)畫面,或按Q鍵停止顯示。
3.less命令也可以分頁顯示文件,和more命令的區(qū)別就在于它支持上下鍵卷動(dòng)屏幕,當(dāng)結(jié)束瀏覽時(shí),只要在less命令的提示符": "下按Q鍵即可。
另外,多數(shù)情況下more和less命令會(huì)配合管道符來分頁輸出需要在屏幕上顯示的內(nèi)容。
cat:
cat命令是linux下的一個(gè)文本輸出命令,通常是用于觀看某個(gè)文件的內(nèi)容的;
? ? cat主要有三大功能:
? ? 1.一次顯示整個(gè)文件。
? ? cat? filename
? ? 2.從鍵盤創(chuàng)建一個(gè)文件。
? ? cat? >? filename
? ? 只能創(chuàng)建新文件,不能編輯已有文件。編輯好后Ctrl+C退出編輯模式。
? ? 3.將幾個(gè)文件合并為一個(gè)文件。
? ? cat? file1? file2? > file
? ? cat具體命令格式為 : cat [-AbeEnstTuv] [--help] [--version] fileName
? ? 參數(shù):
? ? -n 或 -number 由 1 開始對(duì)所有輸出的行數(shù)編號(hào)
? ? -b 或 -number-nonblank 和 -n 相似,只不過對(duì)于空白行不編號(hào)
? ? -s 或 -squeeze-blank 當(dāng)遇到有連續(xù)兩行以上的空白行,就代換為一行的空白行
? ? ...
范例:
? ? cat -n linuxfile1 > linuxfile2 把 linuxfile1 的檔案內(nèi)容加上行號(hào)后輸入 linuxfile2 這個(gè)檔案里
? ? cat -b linuxfile1 linuxfile2 >> linuxfile3 把 linuxfile1 和 linuxfile2 的檔案內(nèi)容加上行號(hào)(空白行不加)之后將內(nèi)容附加到linuxfile3 里。
? ? 范例:
? ? 把 linuxfile1 的檔案內(nèi)容加上行號(hào)后輸入 linuxfile2 這個(gè)檔案里
? ? cat -n linuxfile1 > linuxfile2
? ? 把 linuxfile1 和 linuxfile2 的檔案內(nèi)容加上行號(hào)(空白行不加)之后將內(nèi)容附加到 linuxfile3 里。
? ? cat -b linuxfile1 linuxfile2 >> linuxfile3
補(bǔ)充說明:
cat? file1? file2? > file表示將file1和file2的內(nèi)容串接后輸入到file文件中,如果已經(jīng)存在,file文件被重寫。
? ? cat? file1? file2? >>file表示將file1和file2的內(nèi)容串接后輸入到file文件中,如果已經(jīng)存在,新內(nèi)容追加在file文件原內(nèi)容的后面。
more:
more test.log -----將test.log文件內(nèi)容顯示滿一屏幕時(shí)暫停,此時(shí)可按空格健繼續(xù)顯示下一個(gè)畫面,或按Q鍵停止顯示。
cat test.log | grep aug | more? -----將test.log文件篩選出含字符串a(chǎn)ug的行以more的方式顯示輸出
less:
less test.log -----將test.log文件分頁顯示,支持上下鍵卷動(dòng)屏幕,當(dāng)結(jié)束瀏覽時(shí),只要在less命令的提示符": "下按Q鍵即可。
cat test.log | grep aug | less? -----將test.log文件篩選出含字符串a(chǎn)ug的行以less的方式顯示輸出
echo:
echo命令的功能是在顯示器上顯示一段文字,一般起到一個(gè)提示的作用。
? ? 該命令的一般格式為: echo [-n ][-e] 字符串
其中選項(xiàng)n表示輸出文字后不換行;字符串能加引號(hào),也能不加引號(hào)。
? ? -e 若字符串中出現(xiàn)以下字符,則特別加以處理,而不會(huì)將它當(dāng)成一般文字輸出:
?? ? ? \a 發(fā)出警告聲;
?? ? ? \b 刪除前一個(gè)字符;
?? ? ? \c 最后不加上換行符號(hào);
?? ? ? \f 換行但光標(biāo)仍舊停留在原來的位置;
?? ? ? \n 換行且光標(biāo)移至行首;
?? ? ? \r 光標(biāo)移至行首,但不換行;
?? ? ? \t 插入tab;
?? ? ? \v 與\f相同;
?? ? ? \\ 插入\字符;
?? ? ? \nnn 插入nnn(八進(jìn)制)所代表的ASCII字符;
echo示例:
? ? 示例一 打印當(dāng)前的PATH設(shè)置
? ? [root@jfht ~]# echo $PATH?
? ? /usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
? ? 示例二 打印當(dāng)前的LANG設(shè)置
? ? [root@jfht ~]# echo $LANG?
? ? zh_CN.GB18030
? ? 示例三 對(duì)輸出信息進(jìn)行轉(zhuǎn)義,比如輸出換行
? ? echo "hello\nworld"?
? ? hello\nworld
? ? echo -e "hello\nworld"?
? ? hello
? ? world
? ? echo hello; echo world?
? ? hello
? ? world
sed:
1. sed替換的基本語法為:? ? ? ? sed 's/原字符串/替換字符串/'? ? ------------單引號(hào)里面,s表示替換,三根斜線中間是替換的樣式,特殊字符需要使用反斜線"\"進(jìn)行轉(zhuǎn)義。
2. 單引號(hào)是沒有辦法用反斜線"\"轉(zhuǎn)義的,這時(shí)候只要把命令中的單引號(hào)改為雙引號(hào)就行了,格式如下:
# 要處理的字符包含單引號(hào)
sed "s/原字符串包含'/替換字符串包含'/"?
3. 命令中的三根斜線分隔符可以換成別的符號(hào),有時(shí)候替換目錄字符串的時(shí)候有較多斜線,這個(gè)時(shí)候換成其它的分割符是較為方便,只需要緊跟s定義即可。
# 將分隔符換成問號(hào)"?":
sed 's?原字符串?替換字符串?'
4. 可以在末尾加g替換每一個(gè)匹配的關(guān)鍵字,否則只替換每行的第一個(gè),例如:
# 替換所有匹配關(guān)鍵字
sed 's/原字符串/替換字符串/g'
5. 一些特殊字符的使用
"^"表示行首
"$"符號(hào)如果在引號(hào)中表示行尾,但是在引號(hào)外卻表示末行(最后一行)
# 注意這里的 " & " 符號(hào),如果沒有 "&",就會(huì)直接將匹配到的字符串替換掉
?? ? ? sed 's/^/添加的頭部&/g' #在所有行首添加
?? ? ? sed 's/$/&添加的尾部/g' #在所有行末添加
?? ? ? sed '2s/原字符串/替換字符串/g' #替換第2行
?? ? ? sed '$s/原字符串/替換字符串/g'? #替換最后一行
?? ? ? sed '2,5s/原字符串/替換字符串/g' #替換2到5行
?? ? ? sed '2,$s/原字符串/替換字符串/g' #替換2到最后一行
6.批量替換字符串(mac如下)
sed -i '' "s/查找字段/替換字段/g" `grep 查找字段 -rl 路徑`
sed -i '' "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
7. sed處理過的輸出是直接輸出到屏幕上的,使用參數(shù)"i"直接在文件中替換。
# 替換文件中的所有匹配項(xiàng)
sed -i 's/原字符串/替換字符串/g' filename
8. 多個(gè)替換可以在同一條命令中執(zhí)行,用分號(hào)";"分隔,其格式為:
# 同時(shí)執(zhí)行兩個(gè)替換規(guī)則
sed 's/^/添加的頭部&/g;s/$/&添加的尾部/g'
awk:
awk語言的最基本功能是在文件或者字符串中基于指定規(guī)則瀏覽和抽取信息。
通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執(zhí)行相應(yīng)的命令,來處理文本。
相對(duì)于grep的查找,awk強(qiáng)在對(duì)文本的分析處理。
使用方法
awk '{pattern + action}' {filenames}
pattern 表示 AWK 在數(shù)據(jù)中查找的內(nèi)容,而 action 是在找到匹配內(nèi)容時(shí)所執(zhí)行的一系列命令?;ɡㄌ?hào)({})不需要在程序中始終出現(xiàn),但它們用于根據(jù)特定的模式對(duì)一系列指令進(jìn)行分組。?
調(diào)用awk
命令行方式調(diào)用awk
awk [-F? field-separator]? 'commands'? input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項(xiàng)稱為一個(gè)域。通常,在不指名-F域分隔符的情況下,默認(rèn)的域分隔符是空格。
?入門實(shí)例
假設(shè)last -n 5的輸出如下
[root@www ~]# last -n 5
root? ? pts/1? 192.168.1.100? Tue Feb 10 11:21? still logged in
root? ? pts/1? 192.168.1.100? Tue Feb 10 00:46 - 02:28? (01:41)
root? ? pts/1? 192.168.1.100? Mon Feb? 9 11:41 - 18:30? (06:48)
dmtsai? pts/1? 192.168.1.100? Mon Feb? 9 11:41 - 11:41? (00:00)
root? ? tty1? ? ? ? ? ? ? ? ? Fri Sep? 5 14:09 - 14:10? (00:01)
如果只是顯示最近登錄的5個(gè)帳號(hào)
#last -n 5 | awk? '{print $1}'
root
root
root
dmtsai
root
awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域。默認(rèn)域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。
如果只是顯示/etc/passwd的賬戶
#cat /etc/passwd |awk? -F ':'? '{print $1}'?
root
daemon
bin
sys
這種是awk+action的示例,每行都會(huì)執(zhí)行action{print $1}。
-F指定域分隔符為':'。
如果只是顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以tab鍵分割
#cat /etc/passwd |awk? -F ':'? '{print $1"\t"$7}'
root? ? /bin/bash
daemon? /bin/sh
bin? ? /bin/sh
sys? ? /bin/sh
如果只是顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以逗號(hào)分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk? -F ':'? 'BEGIN {print "name,shell"}? {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
awk工作流程是這樣的:先執(zhí)行BEGIN,然后讀取文件,讀入有/n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域,隨后開始執(zhí)行模式所對(duì)應(yīng)的動(dòng)作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作。
搜索/etc/passwd有root關(guān)鍵字的所有行
#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
這種是pattern的使用示例,匹配了pattern(這里是root)的行才會(huì)執(zhí)行action(沒有指定action,默認(rèn)輸出每行的內(nèi)容)。
搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root關(guān)鍵字的所有行,并顯示對(duì)應(yīng)的shell
# awk -F: '/root/{print $7}' /etc/passwd? ? ? ? ? ? ?
/bin/bash
這里指定了action{print $7}
模式可以是以下任意一個(gè):
/正則表達(dá)式/:使用通配符的擴(kuò)展集。
關(guān)系表達(dá)式:可以用下面運(yùn)算符表中的關(guān)系運(yùn)算符進(jìn)行操作,可以是字符串或數(shù)字的比較,如$2>%1選擇第二個(gè)字段比第一個(gè)字段長的行。
模式匹配表達(dá)式:用運(yùn)算符~(匹配)和~!(不匹配)。
模式,模式:指定一個(gè)行的范圍。該語法不能包括BEGIN和END模式。
BEGIN:讓用戶指定在第一條輸入記錄被處理之前所發(fā)生的動(dòng)作,通??稍谶@里設(shè)置全局變量。
END:讓用戶在最后一條輸入記錄被讀取之后發(fā)生的動(dòng)作。
幾個(gè)實(shí)例:
$ awk '/^(no|so)/' test-----打印所有以模式no或so開頭的行。
$ awk '/^[ns]/{print $1}' test-----如果記錄以n或s開頭,就打印這個(gè)記錄。
$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一個(gè)域以兩個(gè)數(shù)字結(jié)束就打印這個(gè)記錄。
$ awk '$1 == 100 || $2 < 50' test-----如果第一個(gè)或等于100或者第二個(gè)域小于50,則打印該行。
$ awk '$1 != 10' test-----如果第一個(gè)域不等于10就打印該行。
$ awk '/test/{print $1 + 10}' test-----如果記錄包含正則表達(dá)式test,則第一個(gè)域加10并打印出來。
$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一個(gè)域大于5則打印問號(hào)后面的表達(dá)式值,否則打印冒號(hào)后面的表達(dá)式值。
$ awk '/^root/,/^mysql/' test----打印以正則表達(dá)式root開頭的記錄到以正則表達(dá)式mysql開頭的記錄范圍內(nèi)的所有記錄。如果找到一個(gè)新的正則表達(dá)式root開頭的記錄,則繼續(xù)打印直到下一個(gè)以正則表達(dá)式mysql開頭的記錄為止,或到文件末尾。
awk內(nèi)置變量
awk有許多內(nèi)置變量用來設(shè)置環(huán)境信息,這些變量可以被改變,下面給出了最常用的一些變量。
ARGC? ? ? ? ? ? ? 命令行參數(shù)個(gè)數(shù)
ARGV? ? ? ? ? ? ? 命令行參數(shù)排列
ENVIRON? ? ? ? ? ? 支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FILENAME? ? ? ? ? awk瀏覽的文件名
FNR? ? ? ? ? ? ? ? 瀏覽文件的記錄數(shù)
FS? ? ? ? ? ? ? ? 設(shè)置輸入域分隔符,等價(jià)于命令行 -F選項(xiàng)
NF? ? ? ? ? ? ? ? 瀏覽記錄的域的個(gè)數(shù)
NR? ? ? ? ? ? ? ? 已讀的記錄數(shù)
OFS? ? ? ? ? ? ? ? 輸出域分隔符
ORS? ? ? ? ? ? ? ? 輸出記錄分隔符
RS? ? ? ? ? ? ? ? 控制記錄分隔符
此外,$0變量是指整條記錄。$1表示當(dāng)前行的第一個(gè)域,$2表示當(dāng)前行的第二個(gè)域,......以此類推。
統(tǒng)計(jì)/etc/passwd:文件名,每行的行號(hào),每行的列數(shù),對(duì)應(yīng)的完整行內(nèi)容:
#awk? -F ':'? '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
記錄、域、域分隔符
記錄
awk把每一個(gè)以換行符結(jié)束的行稱為一個(gè)記錄。
記錄分隔符:默認(rèn)的輸入和輸出的分隔符都是回車,保存在內(nèi)建變量ORS和RS中。
$0變量:它指的是整條記錄。如$ awk '{print $0}' test將輸出test文件中的所有記錄。
變量NR:一個(gè)計(jì)數(shù)器,每處理完一條記錄,NR的值就增加1。如$ awk '{print NR,$0}' test將輸出test文件中所有記錄,并在記錄前顯示記錄號(hào)。
域
記錄中每個(gè)單詞稱做"域",默認(rèn)情況下以空格或tab分隔。awk可跟蹤域的個(gè)數(shù),并在內(nèi)建變量NF中保存該值。如$ awk '{print $1,$3}' test將打印test文件中第一和第三個(gè)以空格分開的列(域)。
域分隔符
內(nèi)建變量FS保存輸入域分隔符的值,默認(rèn)是空格或tab。我們可以通過-F命令行選項(xiàng)修改FS的值。如$ awk -F: '{print $1,$5}' test將打印以冒號(hào)為分隔符的第一,第五列的內(nèi)容。
可以同時(shí)使用多個(gè)域分隔符,這時(shí)應(yīng)該把分隔符寫成放到方括號(hào)中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒號(hào)和tab作為分隔符。
輸出域的分隔符默認(rèn)是一個(gè)空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5間的逗號(hào)就是OFS的值。