天天看點

Linux的shell程式設計前奏常見指令實戰一

                                                 Linux的shell程式設計前奏常見指令實戰一

前言: linux中指令的一般形式為:指令  [參數] [路徑檔案]。參數其實就相當于面向對象語言java中的方法的重載一樣,即我實作一個行為有多種方法,每一種方法都需要必要的工具條件,可以把這些參數想象成這些參數。路徑檔案就相當于做一件事情你要指向的目标。做運維的原則簡單,易用高效。本文涉及到的shell程式設計基礎指令有man,touch,ls,mkdir,cp,cd,rm,mv,echo,pwd,cat.alias,unalias,head,tail,tree,rmdir。中級指令有xargs,find,awk,sed,grep,vi,vim,seq。

1>建立一個目錄/data,在/data下面建立一個檔案oldboy.txt,為oldboy.txt檔案增加内容"I am studying linux"

[root@lll3 /]# mkdir /data
[root@lll3 /]# cd /data;touch oldboy.txt            ------建立文本檔案:touch /data/oldboy.txt         ;為多個指令的分隔符
[root@lll3 data]# echo "I amd studying linux" >> oldboy.txt     ------标準輸出重定向:echo相當于java中system.out.println(''I am studying linux''),>>的指向為資料流向
              ------單行文本覆寫:>指向為資料流向(資料朝着箭頭的方向流動)      

2>用一個指令在oldboy.txt中同時增加三行内容:

"I am studying java"

"I am studying php"

"I am studying shell"。

[root@lll3 data]# cat >>oldboy.txt<<EOF      -----同時追加多行文本: cat>>檔案名<<EOF
> I am studing java                                                                                 追加的内容
> I am studying php         EOF
> I am studying shell    ----EOF為标簽對辨別,可以用其它的成對代替。
> EOF      

總結: 重定向:     <-----這個功能在linux裡面是經常用到,實際上就是你看到的大于号小于号一樣的東西

意思是将“資料傳到其它地方”。将某個指令執行後本應該出現在螢幕上的資料,傳輸到其它地方。

執行指令時,這個指令可能會通過檔案讀入資料,經過處理之後,再将資料輸出到螢幕。

>或1>          輸出重定向: 把前面輸出的東西輸入到後面的檔案中,會删除檔案原有内容

>>或1>>     追加重定向: 把前面輸出的東西追加到後面的檔案中,不會删除檔案原有内容

<或<0          輸入重定向:輸入重定向用于改變指令的輸入,指定輸入的内容,後跟檔案名

<<或<<0     輸入重定向: 後跟字元串,用來表示“輸入結束”,也可用ctrl+d來結束輸入

2>                錯誤重定向: 把錯誤資訊輸入到後面的檔案中,會删除檔案原有内容      

2>>             錯誤追加重定向: 把錯誤資訊輸入到後面的檔案中,不會删除檔案原有内容      

标準輸入(stdin):代碼為0,使用<或<<

标準輸出(stdout):  代碼為1,使用>或>>

标準錯誤(stderr):代碼為2,使用2>或2>>

特殊:

2>&1 把标準錯誤重定向到标準輸出

3>把oldboy.txt檔案拷貝到/tmp下,把/data目錄移動到/root下

[root@lll3 data]# cp oldboy.txt /tmp   -----生産環境中一般先用cp指令拷貝備份一份,再删除;或者先用mv移動到/tmp下,然後等/tmp分區将要滿時一次性删除
[root@lll3 data]# cd ..;mv /data /root/          -----..上級目錄;.目前目錄;-上一次目錄;~家目錄      

4>進入root目錄下的/data目錄,删除oldboy.txt

[

root@lll3 /]# cd /root/data/;rm -fr oldboy.txt   -----生産環境中一般先用cp指令拷貝備份一份,再删除      

總結: 在腳本中删除檔案或目錄時生産環境的使用方法

A.和xargs搭配用法

find . -type f -mtime +15 |xargs rm -f               ---删檔案,15天以前
find . -type f -mtime +30 |xargs rm -fr      ---删目錄,30天以前      

B.使用find的-exec

find /logs -type f -mtime +5 -exec rm {} \;        ---在logs目錄下查找更改時間在5日以前的檔案并删除他們
     ----{}find找到的内容
     ---- -exec到\;都是參數
                      ----;是bash特殊的意義,就用反斜線轉義
     ---find常用參數-type;-size;-mtime;-name      
Linux的shell程式設計前奏常見指令實戰一

5>已知檔案oldboy.txt的内容為:

test

liyao

oldboy

請給出列印oldboy.txt内容時,不包含oldboy字元串的指令.

法一:

root@lll3 /]# mkdir data;touch /data/oldboy.txt;cd /data;cat>>oldboy.txt<<EOF
> test
> liyao
> oldboy
> EOF
[root@lll3 data]# grep -v oldboy oldboy.txt    -----核心指令grep:過濾掉oldboy.txt中oldboy這個字元串,即顯示除oldboy這行以外其它内容
test
liyao      

總結:linux三劍客老三grep常用參數:-v是排除(按行)

法二:

[root@lll3 data]# head -2 oldboy.txt                 ----顯示檔案頭部-n行數
test
liyao      

法三:

[root@lll3 data]# sed /^oldboy/d oldboy.txt    -----把以oldby開頭的删除(按行删除),^是以什麼開頭
test
liyao      

總結:linux三劍客老二sed常用參數:-n取消預設輸出,p是列印,-i直接修改檔案内容(而不是輸出到終端)

法四:

[root@lll3 data]# awk /[^oldboy]/ oldboy.txt            ----[^oldboy] ^意思是非,即不是oldboy
test
liyao      

總結:linux三劍客老大awk常用參數:-F指定分隔符顯示幾列,通過正規表達式取出你想要的内容

6>請用一條指令完成建立目錄/oldboy/test,即建立/oldboy目錄和/oldboy/test目錄

[root@lll3 /]# mkdir -p /oldboy/test/
[root@lll3 /]# tree oldboy/
oldboy/
└── test
1 directory, 0 files      

總結:mkdir常用參數:-p強制遞歸建立目錄

7>已知/tmp目錄下已經存在了test.txt檔案,如何執行指令才能把/mnt/test.txt拷貝到/tmp下覆寫

掉/tmp/test.txt,而讓linux系統不提示是否覆寫(root權限下)

root@lll3 /]# touch /tmp/test.txt;touch /mnt/test.txt;which cp         -----which後接指令表示查找該指令所在全路徑,還可以whereis,locate,find
alias cp='cp -i'
        /bin/cp
您在 /var/spool/mail/root 中有新郵件
[root@lll3 /]# /bin/cp /tmp/test.txt /mnt/
[root@lll3 /]# alias                                                                            ------檢視系統中所有的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@lll3 ~]# cat ~/.bashrc------别名的位置
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi      

總結: rm,mv,cp這些危險指令為何會有确認提示(用于保護措施防止誤操作,另外一個把指令化繁為簡)?

        是因為系統中别名的作用,如使用cp時預設就是用cp -i參數,是以會有參數。  取消别名可以用unalias接指令。

        定義永久别名可以在/etc/profile中定義。

8>隻檢視ett.txt檔案裡(100行)20到第30行的内容

[root@lll3 tmp]# touch ett.txt;for ((i=1;i<=100;i++));do echo "$i">>ett.txt;done
[root@lll3 tmp]# head -30 ett.txt|tail -11             ----head顯示檔案前多少行,tail顯示檔案後多少行
20
21
22
23
24
25
26
27
28
29
30
法二:
[root@lll3 tmp]# touch ett.txt;seq 100 >> ett.txt
[root@lll3 tmp]# sed -n '20,30p' ett.txt
20
21
22
23
24
25
26
27
28
29
30
法三:
[root@lll3 tmp]# touch ett.txt;for i in {1..100};do echo "$i" >>ett.txt;done
[root@lll3 tmp]# awk 'NR==20,NR==30' ett.txt
20
21
22
23
24
25
26
27
28
29
30
法四:
[root@lll3 tmp]# touch ett.txt;i=1;while((i<=100));do echo "$i" >>ett.txt;((i++));done
[root@lll3 tmp]# awk '{if(NR>19&&NR<31) print $0}' ett.txt 
20
21
22
23
24
25
26
27
28
29
30      

總結:sed擅長行處理,awk擅長列處理

9>把系統中所有ett.txt檔案中oldboylinux字元串替換成oldboywindows

root@lll3 tmp]# echo "oldboylinux">ett.txt;cp ett.txt /opt/;cp ett.txt /etc/
cp:是否覆寫"/opt/ett.txt"? y
cp:是否覆寫"/etc/ett.txt"? y
[root@lll3 tmp]# sed -i s#oldboylinux#oldboywindows#g ett.txt
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs sed -i s#oldboylinux#oldboywindows#g
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs cat
oldboywindows
oldboywindows
oldboywindows
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs ls
/etc/ett.txt  /opt/ett.txt  /tmp/ett.txt      

總結:secureCRT常用操作快捷鍵

ctrl+c 終止指令;

ctrl+d 跳出使用者環境;

ctrl+a 到指令行行首;

ctrl+e 到指令行行尾;

ctrl+u 清除所在指令行;

一技之長,理财投資,寫作思考  敬請關注“石林筆記”公衆号或者掃我喲: