1. 程式人生 > >Linux之命令進階

Linux之命令進階

Linux系統的啟動過程

1.開機自檢 BIOS
2.MBR引導
3.GRUB選單
4.載入核心
5.執行init程序
6.從/etc/inittab讀取執行級別
7.根據/etc/rc.sysinit 初始化系統(設定主機名 設定ip)
8.根據執行級別啟動對應的軟體(開機自啟動軟體)
9.執行mingetty顯示登入介面

 

PATH環境變數

什麼是環境變數

1、大寫

2、在系統大部分地方都可以使用,含義相同

3、常見的環境變數

LANG     PATH    PS1

PATH含義

路徑-存放的是Linux命令的位置/路徑

[[email protected]_boy-001 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 
# 用冒號分割 [[email protected]_boy
-001 ~]# echo $LANG en_US.UTF-8

linux下面執行命令過程

1、輸入命令

2、在PATH裡面 進行查詢

3、找到了就執行,找不到就提示:command not found

檢視目錄

如何過濾出已知當前目錄下oldboy中的所有一級目錄(提示:不包含oldboy目錄下面目錄的子目錄及隱藏目錄,即只能是第一級目錄)?

##建立環境
mkdir /oldboy -p
cd /oldboy
mkdir ext/oldboy test xiaodong xiaofan xingfujie -p
touch jeacen oldboy wodi.gz yingsui.gz

 

##方法1-tree
yum install  tree -y
[[email protected]-lnb oldboy]# tree -Ld 1
.
├── ext
├── test
├── xiaodong
├── xiaofan
└── xingfujie

5 directories

##方法2-find [[email protected] oldboy]# find -maxdepth 1 -type d 把-maxdepth放在前面,否則會有警告資訊 . ./xingfujie ./test ./xiaodong ./xiaofan ./ext [[email protected]-lnb oldboy]# find -maxdepth 1 -type d -name "." . [[email protected]-lnb oldboy]# find -maxdepth 1 -type d ! -name "." ./xingfujie ./test ./xiaodong ./xiaofan ./ext ##方法3-grep [[email protected] oldboy]# ls -l |grep "以d開頭的行" [[email protected] oldboy]# ls -l |grep "^d" drwxr-xr-x 3 root root 4096 Dec 15 00:26 ext drwxr-xr-x. 2 root root 4096 Dec 11 21:22 test drwxr-xr-x 2 root root 4096 Dec 15 00:26 xiaodong drwxr-xr-x 2 root root 4096 Dec 15 00:26 xiaofan drwxr-xr-x 2 root root 4096 Dec 15 00:26 xingfujie ^ 高階貨色(三劍客使用) 正則表示式 以.....開頭的行 ##方法4-awk [[email protected]-lnb oldboy]# ls -l |awk '第2列大於1' awk: 第2列大於1 awk: ^ invalid char '奠in expression [[email protected] oldboy]# ls -l |awk '$2>1' total 32 drwxr-xr-x 3 root root 4096 Dec 15 00:26 ext drwxr-xr-x. 2 root root 4096 Dec 11 21:22 test drwxr-xr-x 2 root root 4096 Dec 15 00:26 xiaodong drwxr-xr-x 2 root root 4096 Dec 15 00:26 xiaofan drwxr-xr-x 2 root root 4096 Dec 15 00:26 xingfujie 這種方法其實是不準確的,瞭解一下 ##方法5-ls [[email protected] oldboy]# ls -F|grep "/" ext/ test/ xiaodong/ xiaofan/ xingfujie/ [[email protected]-lnb oldboy]# #-F 給不通型別的檔案 加上不通的標記/尾巴 ##方法6-ls ls -ld */

 

 

## 檢視某個軟體包裡面有什麼
[[email protected]_boy-001 oldboy]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.5.3
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz
檢視某個軟體是否安裝
rpm -qa |grep tree

 

 跳轉目錄

 如何快速的回到 上一次所在的位置/目錄

 cd -   快速回到上一次的位置。- 相當於 環境變數

cd  -  #cd $OLDPWD
cd  -  #如何快速的回到 上一次所在的位置
cd  .  #當前目錄
        複製/移動
cd  .. #進入當前目錄的上級目錄
cd  ~  #進入當前目錄的家目錄 回老家
cd     #進入當前目錄的家目錄 回老家

 

查詢最近跟新的檔案

一個目錄中有很多檔案(ls查-看時好多屏),想最快速度檢視到最近更新的檔案。如何看?

[[email protected]_boy-001 etc]# ls -lrt
t 按時間排序
r 逆序

 

 實時檢視日誌內容的實時跟新

除錯系統服務時,希望能實時檢視系統日誌/var/log/messages 的更新,如何做?

#1、重新開啟一個視窗
[[email protected]_boy-001 etc]# tail -f /var/log/messages 

tailf ==== tail -f 一樣的

 

 

查詢檔案內容以及行號

列印配置檔案nginx.conf的內容的行號以及內容,該如何做?

打造環境

echo stu{01..10} |xargs -n1 >nginx.conf

 

###方法1
[[email protected] oldboy]# cat -n nginx.conf
     1    stu1
     2    stu2
     3    stu3
     4    stu4
     5    stu5

###方法2 vi /vim
:set nu   #顯示行號
:set nonu #取消顯示行號


###方法3 grep

[[email protected]-39-nb oldboy]# grep -n "." nginx.conf
1:stu1
2:stu2
3:stu3
4:stu4
5:stu5

####. 正則表示式裡面的  表示任意一個字元

###方法4 sed
[[email protected] oldboy]# sed '=' nginx.conf |xargs -n2
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5


###方法5 awk
[[email protected] oldboy]# awk '顯示行號' nginx.conf
awk: 顯示行號
awk: ^ invalid char '?in expression
[[email protected] oldboy]# awk '{print NR}' nginx.conf
1
2
3
4
5
[[email protected]-39-nb oldboy]# awk '{print NR,$0}' nginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5

###方法6
[[email protected] oldboy]# nl nginx.conf
     1    stu1
     2    stu2
     3    stu3
     4    stu4
     5    stu5

 

 

 檔案處理(日誌僅保留7天)

已知apache/nginx服務的訪問日誌按天記錄在伺服器本地目錄/app/logs下,由於磁碟空間緊張,現在要求只能保留最近7天訪問日誌!請問如何解決? 請給出解決辦法或配置或處理命令。(提示:可以從apache服務配置上著手,也可以從生成出來的日誌上著手。)

# 建立環境
mkdir -p /app/logs
cd /app/logs
for  time in  {01..20};do  date -s "201705$time"; touch access_www_$(date +%F).log ;done
date -s "20170520"  修改系統時間

# 前第七天
[[email protected]_boy-001 logs]# find -type f -name '*.log' -mtime 7
./access_www_2017-05-13.log
# 7天之前
[[email protected]_boy-001 logs]# find -type f -name '*.log' -mtime +7
./access_www_2017-05-11.log
./access_www_2017-05-12.log
./access_www_2017-05-10.log
./access_www_2017-05-08.log
./access_www_2017-05-09.log
./access_www_2017-05-01.log
./access_www_2017-05-02.log
./access_www_2017-05-03.log
./access_www_2017-05-06.log
./access_www_2017-05-07.log
./access_www_2017-05-05.log
./access_www_2017-05-04.log
# 最近7天
[[email protected]_boy-001 logs]# find -type f -name '*.log' -mtime -7
./access_www_2017-05-18.log
./access_www_2017-05-15.log
./access_www_2017-05-20.log
./access_www_2017-05-16.log
./access_www_2017-05-19.log
./access_www_2017-05-17.log
./access_www_2017-05-14.log

 

 

找出/app/logs下面以.log結尾的並且修改時間是7天之前的檔案並刪除(ls -l)
find /app/logs/ -type f -name "*.log"  -mtime +7

#find /app/logs/ -type f -name "*.log"  -mtime +7|xargs ls -l
#ls -l $(find /app/logs/ -type f -name "*.log"  -mtime +7)
#find /app/logs/ -type f -name "*.log"  -mtime +7  -exec ls -l {}  \;


通過系統軟體對日誌進行切割。

補充find命令相關題目:

查詢/oldboy 下所有以log 結尾的大於1M 的檔案複製到/tmp

[[email protected]-lnb logs]# cat /etc/services  /etc/services > 1m.log
[[email protected] logs]# ls -lh 1m.log
-rw-r--r-- 1 root root 1.3M Dec 12 00:14 1m.log


find /oldboy  -type f -name "*.log"  -size +1M

-size +1M
-size +100k



find /oldboy  -type f -name "*.log"

mkdir -p /tmp/a /tmp/b /tmp/c /tmp/d

方法1 find+$()
#cp 次處是find命令的結果  /tmp/a/
cp   $(find /app/logs/ -type f -name "*.log")  /tmp/a/

方法2 find + -exec
find /app/logs/ -type f -name "*.log" -exec cp {} /tmp/b/  \;


方法3 find + |xargs
find /app/logs/ -type f -name "*.log" |xargs cp -t /tmp/c

 

 

 

 設定服務的開啟級別

裝完系統後,希望讓網路檔案共享服務NFS(iptables),僅在3級別上開機自啟動,應該怎麼做?

[[email protected]_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:on    4:on    5:on    6:off
[[email protected]_boy-001 logs]# chkconfig --level 3 iptables off
[[email protected]_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:off    4:on    5:on    6:off
[[email protected]_boy-001 logs]# chkconfig --level 35 iptables off
[[email protected]_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:off    4:on    5:off    6:off

 

 

備份一堆檔案-打包tar

/etc/目錄是linux系統預設的配置檔案以及服務啟動命令的目錄

a、請用tar打包/etc整個目錄(打包以及壓縮)

b、請把a點命令的壓縮包,解壓到/tmp 指定目錄下(最好用tar命令實現)

c、請用tar打包/etc整個目錄(打包及壓縮,但需要排除/etc/services檔案)

 tar - 建立檢視解壓 壓縮包

####建立一個壓縮包

#tar zcvf /tmp/etc.tar.gz /etc/


#z----壓縮工具---gzip    最常用一種  壓縮之後我們一般給 壓縮包命名位 xxxx.tar.gz
#c----建立-------create
#v----顯示壓縮/解壓過程
#f----file------指定壓縮包的名字


###檢視壓縮包裡面的內容
tar ztf /tmp/etc.tar.gz

#t---list------列表 顯示

###解壓----解壓到當前目錄
# cd /tmp/
# pwd
/tmp
# tar zxvf /tmp/etc.tar.gz

#x-----extract 解壓

 

 

 提示的是什麼?:

[[email protected]_boy-001 etc]# tar zcf /etc/haha.tar.gz /etc/
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
tar: /etc: file changed as we read it

###問題:"建立壓縮包"的時候會提示
tar: Removing leading `/' from member names
tar:把每個檔案開頭的/刪除掉了。
/etc/hosts ------>  etc/hosts
tar命令提示你:我在建立壓縮包的時候 把壓縮包中的檔案 絕對路徑----->相對路徑

tar: Removing leading `/' from hard link targets
打包的時候使用相對路徑,就不會出現提示了
###小結:核心 為了安全----tar命令 把你使用的絕對路徑----變化為-----相對路徑

 

 b和c的答案:

b.請用tar打包/etc整個目錄(打包及壓縮,但需要排除/etc/services檔案)。

[[email protected]-39-nb /]# tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=services   ###排除所有檔名叫services的檔案
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
[[email protected] /]# tar tf /tmp/etc-pai.tar.gz |grep services
etc/init/readahead-disable-services.conf
[[email protected]-39-nb /]# tar tf /tmp/etc.tar.gz |grep services
etc/services
etc/init/readahead-disable-services.conf


##排除---精確版本 加上位置
[[email protected] /]# tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=etc/services
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
[[email protected] /]# tar tf /tmp/etc-pai.tar.gz |grep services
etc/sysconfig/services
etc/init/readahead-disable-services.conf


#把你要排除的名單寫到一個檔案中 /tmp/paichu.txt(瞭解)
#tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude-from=/tmp/paichu.txt


c.請把a點命令的壓縮包,解壓到/tmp指定目錄下(最好只用tar命令實現)。
tar xf /tmp/etc-pai.tar.gz -C /opt


把/etc/hosts /etc/sysconfig/network /etc/sysconfig/i18n /etc/init.d/  打包壓縮 /tmp/conf.tar.gz
解壓到/opt目錄


[[email protected]-39-nb /]# tar zcf /tmp/conf.tar.gz /etc/hosts /etc/sysconfig/network /etc/sysconfig/i18n /etc/init.d/
tar: Removing leading `/' from member names
[[email protected] /]# tar tf /tmp/conf.tar.gz
etc/hosts
etc/sysconfig/network
etc/sysconfig/i18n
etc/init.d
[[email protected]-39-nb /]# tar xf /tmp/conf.tar.gz -C /opt/
[[email protected] /]# ls  /opt/
etc  rh

 

小結:

#1.建立壓縮包
tar zcf /tmp/oldboy.tar.gz   /oldboy

#2.檢視壓縮包中的內容
tar tf /tmp/oldboy.tar.gz

#3.解壓---解壓到當前目錄
tar xf  /tmp/oldboy.tar.gz
tar xf  /tmp/oldboy.tar.gz  -C /opt

#4.建立壓縮包的時候 排除
tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=etc/services

tar zcf /tmp/etc-pai.tar.gz /etc/ --exclude-from=/tmp/paichu.txt

 

sed和awk篩選出檔案中的指定內容

已知如下命令及結果:
mkdir -p /oldboy
echo "I am oldboy,myqq is 31333741">/oldboy/oldboy.txt

a.現在需要從檔案中過濾出“oldboy”和“31333741”字串,請給出命令.
b.如果需要從檔案中過濾出“oldboy,31333741”字串,請再給出命令.

a.現在需要從檔案中過濾出“oldboy”和“31333741”字串,請給出命令.
方法1-sed-sed
[[email protected]-nb oldboy]# sed 's#I am ##g' oldboy.txt |sed 's#,myqq is##g'
oldboy 31333741
方法2-sed/tr+awk [[email protected]-nb oldboy]# sed 's#,# #g' oldboy.txt |awk '{print $3,$6}' oldboy 31333741 [[email protected]-nb oldboy]# tr "," " " <oldboy.txt |awk '{print $3,$6}' oldboy 31333741 方法3-awk指定多個分隔符號 [[email protected]-nb oldboy]# cat oldboy.txt I am oldboy,myqq is 31333741 [[email protected]-nb oldboy]# awk -F "," '{print $1}' oldboy.txt I am oldboy [[email protected]-nb oldboy]# awk -F "[, ]" '{print $3,$6}' oldboy.txt oldboy 31333741 -F "[, ]" 表示以逗號或者空格作為菜刀 分隔符 b.如果需要從檔案中過濾出“oldboy,31333741”字串,請再給出命令. [[email protected]-nb oldboy]# awk -F "[, ]" '{print $3,$6}' oldboy.txt oldboy 31333741 [[email protected]-nb oldboy]# awk -F "[, ]" '{print $3","$6}' oldboy.txt oldboy,31333741 [[email protected]-nb oldboy]# awk -F "[, ]" '{print $3"$1"$6}' oldboy.txt oldboy$131333741 [[email protected]-nb oldboy]# awk -F "[, ]" '{print $3" $1 "$6}' oldboy.txt oldboy $1 31333741 小結: 1.tr命令 2.awk指定分隔符 指定多個分隔符

 

awk分割列的方式

 

統計檔案資訊  wc  -l

可以統計檔案有多少行,有多少單詞,多大等

如何檢視/etc/services檔案的有多少行?

[[email protected] oldboy]# wc -l /etc/services
10774 /etc/services

 

 

檢視程式是否執行 ps  -ef

屌絲去洗浴中心之路
3.
1)檢視22埠是否開啟 telnet
2)sshd遠端連線程序是否在執行******
ps -ef

[[email protected] oldboy]# ps -ef |grep "sshd"
root       1509      1  0 17:51 ?        00:00:00 /usr/sbin/sshd
root       1669   1509  0 17:51 ?        00:00:00 sshd: [email protected]/0
root       1795   1509  0 18:17 ?        00:00:00 sshd: [email protected]/1
root       1813   1671  0 18:17 pts/0    00:00:00 grep sshd

[[email protected]-nb oldboy]# ps -ef |grep "/sshd"
root       1509      1  0 17:51 ?        00:00:00 /usr/sbin/sshd
root       1817   1671  0 18:19 pts/0    00:00:00 grep /sshd
[[email protected]-nb oldboy]# ps -ef |grep "/sshd"|wc -l   得到數字
2

 

 

過濾指定內容所在行的內容 egrep

過濾出/etc/services 檔案包含3306或1521兩數字所在的行的內容。

[[email protected] oldboy]# egrep "3306|1521" /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager
[[email protected] oldboy]# #egrep === grep -E 支援高階正則(公雞裡的戰鬥機)

 

 

命令列及shell中加單引號和加雙引號的區別

 單引號 所見即所得 吃啥吐啥
[[email protected]-nb oldboy]# echo 'hello lls $LANG $(hostname) `pwd`'
hello lls $LANG $(hostname) `pwd`

 雙引號 裡面的特殊符號會被解析

[[email protected]-nb oldboy]# echo "hello lls $LANG $(hostname) `pwd`"
hello lls en_US.UTF-8 oldboyedu01-nb /oldboy