在Unix/Linux下,高效工作方式不是操作圖形頁面,而是命令行操作,命令行意味著更容易自動化。使用過Linux系統(tǒng)的朋友應(yīng)該都知道它的命令行強大之處。話說回來了,以下這些命令使用技巧你又知道多少呢?
創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計和自適應(yīng)建站服務(wù)。團隊由有經(jīng)驗的網(wǎng)頁設(shè)計師、程序員和市場專家組成,能夠提供從H5響應(yīng)式網(wǎng)站,網(wǎng)站制作,廣告投放平臺,模板建站到微信小程序等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
1、Vim自動添加注釋及智能換行
# vi ~/.vimrc set autoindentset tabstop=4set shiftwidth=4function AddTitle()call setline(1,"#!/bin/bash")call append(1,"#====================================================")call append(2,"# Author: lizhenliang")call append(3,"# Create Date: " . strftime("%Y-%m-%d"))call append(4,"# Description: ")call append(5,"#====================================================")endfmap F4 :call AddTitle()cr
打開文件后,按F4就會自動添加注釋,省了不少時間:
2、查找并刪除/data這個目錄7天前創(chuàng)建的文件
# find /data -ctime +7 -exec rm -rf {} \;# find /data -ctime +7 | xargs rm -rf
3、tar命令壓縮排除某個目錄
# tar zcvf data.tar.gz /data --exclude=tmp #--exclude參數(shù)為不包含某個目錄或文件,后面也可以跟多個
4、查看tar包存檔文件,不解壓
# tar tf data.tar.gz #t是列出存檔文件目錄,f是指定存檔文件
5、使用stat命令查看一個文件的屬性
訪問時間(Access)、修改時間(modify)、狀態(tài)改變時間(Change)stat index.phpAccess: 2018-05-10 02:37:44.169014602 -0500Modify: 2018-05-09 10:53:14.395999032 -0400Change: 2018-05-09 10:53:38.855999002 -0400
6、批量解壓tar.gz
方法1:# find . -name "*.tar.gz" -exec tar zxf {} \;方法2:# for tar in *.tar.gz; do tar zxvf $tar; done方法3:# ls *.tar.gz | xargs -i tar zxvf {}
7、篩除出文件中的注釋和空格
方法1:# grep -v "^#" httpd.conf |grep -v "^$"方法2:# sed -e ‘/^$/d’ -e ‘/^#/d’ httpd.conf http.conf或者# sed -e '/^#/d;/^$/d' #-e 執(zhí)行多條sed命令方法3:# awk '/^[^#]/|/"^$"' httpd.conf 或者# awk '!/^#|^$/' httpd.conf
8、篩選/etc/passwd文件中所有的用戶
方法1:# cat /etc/passwd |cut -d: -f1方法2:# awk -F ":" '{print $1}' /etc/passwd
9、iptables網(wǎng)站跳轉(zhuǎn)
先開啟路由轉(zhuǎn)發(fā):echo "1" /proc/sys/net/ipv4/ip_forward #臨時生效內(nèi)網(wǎng)訪問外網(wǎng)(SNAT):iptables –t nat -A POSTROUTING -s [內(nèi)網(wǎng)IP或網(wǎng)段] -j SNAT --to [公網(wǎng)IP]#內(nèi)網(wǎng)服務(wù)器要指向防火墻內(nèi)網(wǎng)IP為網(wǎng)關(guān)公網(wǎng)訪問內(nèi)網(wǎng)(DNAT)(公網(wǎng)端口映射內(nèi)網(wǎng)端口):iptables –t nat -A PREROUTING -d [對外IP] -p tcp --dport [對外端口] -j DNAT --to [內(nèi)網(wǎng)IP:內(nèi)網(wǎng)端口]#內(nèi)網(wǎng)服務(wù)器要配置防火墻內(nèi)網(wǎng)IP為網(wǎng)關(guān),否則數(shù)據(jù)包回不來。另外,這里不用配置SNAT,因為系統(tǒng)服務(wù)會根據(jù)數(shù)據(jù)包來源再返回去。
10、iptables將本機80端口轉(zhuǎn)發(fā)到本地8080端口
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
11、find命令查找文件并復(fù)制到/opt目錄
方法1:# find /etc -name httpd.conf -exec cp -rf {} /opt/ \;: #-exec執(zhí)行后面命令,{}代表前面輸出的結(jié)果,\;結(jié)束命令方法2:# find /etc -name httpd.conf |xargs -i cp {} /opt #-i表示輸出的結(jié)果由{}代替
12、查看根目錄下大于1G的文件
# find / -size +1024M 默認(rèn)單位是b,可以使用其他單位如,C、K、M
13、查看服務(wù)器IP連接數(shù)
# netstat -tun | awk '{print $5}' | cut -d: -f1 |sort | uniq -c | sort -n -tun:-tu是顯示tcp和udp連接,n是以IP地址顯示cut -d:-f1:cut是一個選擇性顯示一行的內(nèi)容命令,-d指定:為分隔符,-f1顯示分隔符后的第一個字段。uniq -c:報告或刪除文中的重復(fù)行,-c在輸出行前面加上出現(xiàn)的次數(shù)sort -n:根據(jù)不同類型進行排序,默認(rèn)排序是升序,-r參數(shù)改為降序,-n是根據(jù)數(shù)值的大小進行排序
14、插入一行到391行,包括特殊符號"/"
# sed -i "391 s/^/AddType application\/x-httpd-php .php .html/" httpd.conf
15、列出nginx日志訪問最多的10個IP
方法1:# awk '{print $1}' access.log |sort |uniq -c|sort -nr |head -n 10sort :排序uniq -c:合并重復(fù)行,并記錄重復(fù)次數(shù)sort -nr :按照數(shù)字進行降序排序方法2:# awk '{a[$1]++}END{for(v in a)print v,a[v] |"sort -k2 -nr |head -10"}' access.log
16、顯示nginx日志一天訪問量最多的前10位IP
# awk '$4="[16/May/2017:00:00:01" $4="[16/May/2017:23:59:59"' access_test.log |sort |uniq -c |sort-nr |head -n 10# awk '$4="[16/Oct/2017:00:00:01" $4="[16/Oct/2017:23:59:59"{a[$1]++}END{for(i in a){print a[i],i|"sort -k1 -nr |head -n 10"}}' access.log
17、獲取當(dāng)前時間前一分鐘日志訪問量
# date=`date +%d/%b/%Y:%H:%M --date="-1 minute"` ; awk -vd=$date '$0~d{c++}END{print c}' access.log# date=`date +%d/%b/%Y:%H:%M --date="-1 minute"`; awk -vd=$date '$4="["d":00" $4="["d":59"{c++}END{print c}' access.log # grep `date +%d/%b/%Y:%H:%M --date="-1 minute"` access.log |awk 'END{print NR}'# start_time=`date +%d/%b/%Y:%H:%M:%S --date="-5 minute"`;end_time=`date +%d/%b/%Y:%H:%M:%S`;awk -vstart_time="[$start_time" -vend_time="[$end_time" '$4=start_time $4=end_time{count++}END{print count}' access.log
18、找出1-255之間的整數(shù)
方法1:# ifconfig |grep -o '[0-9]\+' #+號匹配前一個字符一次或多次方法2:# ifconfig |egrep -o '\([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\'
19、找出IP地址
# ifconfig |grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' #-o只顯示匹配字符
20、給文檔增加開頭和結(jié)尾說明信息
# awk ‘BEGIN{print "開頭顯示信息"}{print $1,$NF} END{print "結(jié)尾顯示信息"}’/etc/passwd# awk 'BEGIN{printf " date ip\n------------------\n"} {print $3,$4} END{printf "------------------\nend...\n"}' /var/log/messages date ip------------------03:13:01 localhost10:51:45 localhost------------------end...
21、查看網(wǎng)絡(luò)狀態(tài)命令
# netstat -antp #查看所有網(wǎng)絡(luò)連接# netstat -lntp #只查看監(jiān)聽的端口信息# lsof -p pid #查看進程打開的文件句柄# lsof -i:80 #查看端口被哪個進程占用
22、生成8位隨機字符串
方法1:# echo $RANDOM |md5sum |cut -c 1-8方法2:# openssl rand -base64 4方法3:# cat /proc/sys/kernel/random/uuid | cut -c 1-8
23、while死循環(huán)
while true; do #條件精確等于真,也可以直接用條件[ "1" == "1" ],條件一直為真ping -c 2
24.awk格式化輸出
將文本列進行左對齊或右對齊。
左對齊:# awk '{printf "%-15s %-10s %-20s\n",$1,$2,$3}' test.txt右對齊:# awk '{printf "%15s %10s %20s\n",$1,$2,$3}' test.txt
25.整數(shù)運算保留小數(shù)點
方法1:# echo 'scale=2; 10/3;'|bc #scale參數(shù)代表取小數(shù)點位數(shù)方法2:# awk BEGIN'{printf "%.2f\n",10/3}'
26.數(shù)字求和
# cat a.txt10235356方法1:#!/bin/bashwhile read num;dosum=`expr $sum + $num`done a.txtecho $sum方法2:# cat a.txt |awk '{sum+=$1}END{print sum}'
27、判斷是否為數(shù)字(字符串判斷也如此)
# [[ $num =~ ^[0-9]+$ ]] echo yes || echo no #[[]]比[]更加通用,支持模式匹配=~和字符串比較使用通配符`^ $:從開始到結(jié)束是數(shù)字才滿足條件=~:一個操作符,表示左邊是否滿足右邊(作為一個模式)正則表達式
28、刪除換行符并將空格替換別的字符
# cat a.txt |xargs echo -n |sed 's/[ ]/|/g' #-n 不換行# cat a.txt |tr -d '\n' #刪除換行符
29、查看文本中20至30行內(nèi)容(總共100行)
方法1:# awk '{if(NR 20 NR 31) print $0}' test.txt方法2:# sed -n '20,30p' test.txt 方法3:# head -30 test.txt |tail
30、文本中兩列位置替換
# cat a.txt60.35.1.15 awk '{print $2"\t"$1}' a.txt
可以在domain-name-servers配置項中設(shè)置多個dns服務(wù)器,如optiondomain-name-servers1.1.1.1,2.2.2.2;
方法/步驟
從網(wǎng)上下載arm-linux-gcc 4.4.3的源碼
進入Linux的終端,將當(dāng)前目錄設(shè)為arm-linux-gcc的下載目錄,輸入tar -xzf arm-linux-gcc-4.4.3.tar.gz,將文件解壓,解壓后會有一個opt的文件夾。
在/usr/local/下建立一個名為arm的文件夾,在終端中輸入命令:cd /usr/local/,回車,然后再輸入命令:mkdir arm,建立arm目錄,并修改該文件夾的屬性為rwx,輸入命令:chmod 777 arm
將之前解壓得到的opt文件壓下的源碼,復(fù)制到上一步中創(chuàng)建的arm文件夾下,在終端中輸入命令:sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
到這里已經(jīng)基本安裝好了,到為了避免每次使用arm-linux-gcc時都要輸入它所在的完整路徑,所以這里我們要修改一下環(huán)境變量$PATH。在終端中輸入:sudo gedit /etc/profile,打開profile文件,在最后一行加上“export PATH=$PATH:/usr/local/arm/4.4.3/bin”然后保存文件。
立即使新的環(huán)境變量生效,輸入:source /etc/profile。再輸入:echo $PATH查看環(huán)境變量,如圖。如果不成功,則直接重新啟動系統(tǒng),再查看。因為之前我已經(jīng)安裝過了,為了演示,所以圖中會有兩個/usr/local/arm/4.4.3/bin。
最后檢查是否安裝完成,輸入:arm-linux-gcc -v查看版本信息,如果出現(xiàn)以下信息,則說明安裝成功。
Linux命令分為內(nèi)部命令(shell自帶的命令)和外部命令(不是shell自帶的命令,由用戶安裝),怎么鑒別是內(nèi)部命令和外部命令呢?可以通過type命令來鑒別
什么是shell呢?shell是一個程序,常用的有bash shell,平時我們通過用戶名和密碼登錄到linux,其實就是登錄到bash shell程序,通過bash shell來操作linux內(nèi)核
命令執(zhí)行流程
那豈不是說使用外部命令效率會很慢嗎?
其實一點都不慢,它會去PATH環(huán)境變量設(shè)置的一堆目錄中查找
cd is a shell builtin 表示內(nèi)部命令
ifconfig is hashed (/usr/sbin/ifconfig) 表示外部命令
cd命令切換文件夾
現(xiàn)在我們cd /usr/sbin
通過cat命令查看文件內(nèi)容
通過cat ifconfig來查看ifconfig,發(fā)現(xiàn)是亂碼文件
file命令查看文件類型
輸入file ifconfig
從輸出信息可以看出它是一個二進制可執(zhí)行文件
whereis命令查看文件位置
find / -name jdk
echo命令用戶打印信息,相當(dāng)于java中的system.out.println
可以使用回車查看下一行、空格查看下一頁、q退出
一般使用man查看外部命令,help查看內(nèi)部命令
查看linux下的應(yīng)用和應(yīng)用的進程號
當(dāng)我們在這個窗口中輸入kill -9 1593的話,另外一個正在編輯文件的進程就會退出
在前面我們已經(jīng)講過,bash shell程序在執(zhí)行命令的一個過程及原理,對于外部命令,它會去PATH這個環(huán)境變量中查找執(zhí)行命令所在的路徑,當(dāng)然在去PATH中尋找之前會先去hash表中查找這個命令有沒有執(zhí)行過,執(zhí)行過的話會記錄在hash表中,則此次查找只需從hash表中就可以很方便的找到
查看分區(qū)信息 -h 表示文件大小后面會顯示文件大小
查看文件的使用情況
使用man ls 查看ls命令的相關(guān)介紹
-a:可以查看隱藏文件
-l:以長列表的形式展示文件列表信息
第一位 -:表示文件,d表示文件夾,b表示塊設(shè)備文件,c表示字符設(shè)備文件,p表示命令管道文件,s表示套接字文件, 從第二位開始往后數(shù)九位表示屬主權(quán)限(每三位一組 rwx:讀、寫、執(zhí)行),第11位表示的點表示分隔符,點后面的數(shù)字表示文件有幾個硬連接,第一個root代表屬主名,第二個root代表這個第一個root所在的組織,接下來的5表示文件大小,5后面的日期表示文件最后一次修改的時間, 1.txt代表的文件或文件夾的名稱
小結(jié):
切換文件目錄
cd 文件路徑
cd:切換到家目錄
cd ~:回到家目錄(也就是家目錄)
cd ..:回到上一級目錄
創(chuàng)建目錄
mkdir 目錄名
mkdir -p 目錄名,級聯(lián)創(chuàng)建目錄
cp 被拷貝的文件(可以是路徑加文件名) 拷貝到哪個位置
復(fù)制目錄使用
cp -r 被拷貝的目錄 目標(biāo)位置
移動命令
mv 被移動的文件 目標(biāo)位置+目標(biāo)文件名
rm 文件名(此中方式的刪除需要再輸入 yes)
rm -f 文件名,無提示直接刪除
rm -rf 文件夾
ln命令默認(rèn)創(chuàng)建的是硬連接
ln profile a:將a硬連接到profile文件上,他們底層共用一個文件,刪除他們之中任何一個
對另外一個沒有影響,同時你也可以使用 ll -i命令查看文件編號
ln -s profile a:將a軟連接到profile文件,當(dāng)你訪問a的時候會去訪問profile,profile再訪問底層文件,當(dāng)將profile刪除了之后a就無法訪問了
一致時間、創(chuàng)建新文本
touch 已存在的文件:會將文件的訪問時間、更新時間、改變時間(即上面stat中介紹的三個時間)變成一致
touch 不存在的文件:會創(chuàng)建一個新的文本
cat命令查看文件內(nèi)容
cat 1.txt:查看單個文件內(nèi)容
cat 1.txt 2.txt:查看多個文件
more 1.txt:以分頁的形式查看文件內(nèi)容,按空格:下一頁,回車:下一行(注意它不能回看,回看的話只能用鼠標(biāo)回輪)
less 1.txt:使用空格下一頁, b看上一頁, 回車看下一行
注意less的話會把整個文件內(nèi)容加載到內(nèi)存,如果文件比較大的話,建議使用more命令查看
head命令默認(rèn)查看文件前10行內(nèi)容, head 1.txt
head -5 1.txt:查看文件前5行的內(nèi)容
tail命令默認(rèn)查看文件后10行的內(nèi)容 tail 1.txt
tail -5 1.txt:查看文件后5行內(nèi)容
tail -f 1.txt:實時查看文件增量內(nèi)容
cat b.txt | head -3:管道左邊的命令會以輸出流的形式交給管道右邊的命令,管道右邊以輸入流的形式接收并且拼到命令的右邊
注意:ls -l 不能接受前面的輸出流,這個怎么辦呢?可以通過xargs命令
vi文本編輯器末行模式的操作
set nu(number的縮寫): 設(shè)置行號
set nonu(nonumber的縮寫):取消行號
set readonly:設(shè)置為只讀
n:往下查找
N:往上查找
n:往上查找
N:往下查找
一般我們會在/etc/profile文件中設(shè)置一些環(huán)境變量,但是在設(shè)置的時候可能沒有記住目錄,這時候我們可以使用如下方式
效果
格式 :s/str1/str2/gi
/ : 臨近s命令的第一個字符邊界字符,也可以是 @或#
g : 一行內(nèi)全部替換
i : 忽略大小寫
范圍
n:行號
. :當(dāng)前光標(biāo)行
+n :偏移n行
-3
%:全文
全部刪除 1,$d
刪除前三行
刪除倒數(shù)第2行
光標(biāo)挪到最后一行 按下小寫的p
效果圖
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特殊字符、及這些特定字符的組合組成一個"規(guī)則字符串",這個"規(guī)則字符串"用來表達對字符串的一種過濾邏輯。
\ :轉(zhuǎn)義字符
. :匹配任意單個字符
[1249a] :匹配中括號中任意字符
[^12] :匹配中括號中任意非1和2的字符
[a-k] :匹配中括號中任意a~k中的一個字符
^ :行首
$ :行尾
abc :單詞首尾邊界(匹配單詞abc)
| :連接操作符
(,) : 選擇操作符
\n :反向引用
? :匹配0到1次
在Linux中通過grep命令使用正則表達式來匹配信息
f :選擇顯示的列
s :不顯示沒有分隔符的行
d :自定義分隔符
n :按數(shù)值排序
r :倒序
t :自定義分隔符
K :選擇排序列
u :合并相同行
f :忽略大小寫
sed:行編輯器,以行為單位進行處理,可以將數(shù)據(jù)進行替換、刪除、新增、選取等特定工作
sed [options] 'Command' file ...
-n :靜默模式,不再默認(rèn)顯示模式空間(內(nèi)存)中的內(nèi)容
-i :直接修改原文件
-e SCRIPT :可以同時執(zhí)行多個腳本
-f /PATH/TO/SED_SCRIPT
-r :表示使用擴展正則表達式
d :刪除符合條件的行
p :顯示符號條件的行
a \string :在指定的行后面追加新行,內(nèi)容為string
\n :可以用于換行
i \string :在指定的行前面添加新行,內(nèi)容為string
c :取代,c的后面可以接字符串
s /pattern/string/修飾符:查找并替換。默認(rèn)只替換每行中第一次被模式匹配到的字符串
g :行內(nèi)全局替換
i :忽略字符大小寫
s///:s###,s@@@
(),\1,\2
sed "2p" ctxt
但是在執(zhí)行下面的操作的時候文本中的內(nèi)容都顯示出來了,它的原理是,打印匹配的行,以及文本中所有的內(nèi)容
注意:它刪的是內(nèi)存中的數(shù)據(jù),而不是目標(biāo)文件
sed -i "3d" ctxt
它的原理是先把內(nèi)存中的第3行數(shù)據(jù)刪除,然后再把內(nèi)存中的數(shù)據(jù)寫回原文件,這時原文件中的第三行就沒有了
使用變量的形式
awk是一個強大的文本分析工具。
相對于grep的查找,sed的編輯,awk在其對數(shù)據(jù)分析并生成報告時,顯得尤為強大。
簡單來說awk就是把文件逐行的讀入,(空格,制表符)為默認(rèn)分隔符將每行切片,切開的部分再進行各種分析處理。
awk -F '{pattern + action}' {filenames}
支持自定義分隔符,默認(rèn)是以空格分隔的
支持正則表達式匹配
支持自定義變量,數(shù)組 a[1] a[tom] map(key)
支持內(nèi)置變量
ARGC 命令行參數(shù)個數(shù)
ARGV 命令行參數(shù)排列
ENVIRON 支持隊列中系統(tǒng)環(huán)境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數(shù)
FS 設(shè)置輸入域分隔符,等價于命令行 -F選項
NF 瀏覽記錄的域的個數(shù)
NR 已讀的記錄數(shù)
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
支持函數(shù)
print、split、substr、sub、gsub
支持流程控制語句
if、while、do/while、for、break、continue
練習(xí)題
passwd文件內(nèi)容解讀:
passwd文件中每行由7個字段組成,字段與字段之間由:分隔,第一個字段代表用戶名,第二個字段表示用戶對應(yīng)的加密后的密碼,第三個字段表示userId,第四個字段表示groupId,第五個字段表示對用戶的描述,第六個字段表示用戶的家目錄,第七個字段表示的是這個用戶默認(rèn)使用的shell
其中$0表示整行
統(tǒng)計報表:合計每人1月工資, 0:manager,1:worker
將awk后面的內(nèi)容封裝到一個文件中(封裝的腳本要遵循一定的格式)
qqq文件的內(nèi)容格式