1. 程式人生 > >大資料學習筆記(三) -- linux的重要知識點以及相關命令

大資料學習筆記(三) -- linux的重要知識點以及相關命令

linux特點

linux中 一切皆檔案,一個程序也會被對映成檔案,一個硬碟也會被對映成檔案。

linux 是一個虛擬的目錄樹結構,每個分割槽會被對應一個目錄。

window中我們執行一個程式是用滑鼠點選exe,linux中是通過命令,其實輸入一個命令就相當於windows中開啟一個程式。

像下面這種顯示方式,然後接收使用者輸入命令-->解析出命令-->執行命令-->返回結果 就是由bash程式為我們提供的服務

bash的工作原理 : 根據空格切割,第一個元素作為命令,判斷命令是內部命令還是外部命令,在環境變數中以從左到右的順序尋找,找到了就去執行。

[[email protected]
~]# 

 根下目錄含義

proc  核心執行狀態的對映目錄

proc/程序號/fd    存放該程序的 io 流 ,0代表標準輸出流,1代表標準輸入流,2代表錯誤輸出流

bin  可執行檔案目錄

dev  裝置目錄

home 使用者目錄

lib 和 lib64 庫目錄

opt  使用者軟體安裝目錄

usr  一些規範的軟體會自動安裝在usr目錄下

etc   配置檔案目錄

var  存放資料,如資料庫資料或war包

mnt 掛載點目錄,額外的臨時檔案系統

media 掛載點目錄,移動裝置

ls -l  輸出的內容解釋

注意 ,上面的檔案硬連線的次數是針對檔案來說的,如果是一個目錄,該目錄下沒有其他目錄則為2,如果有其他目錄,數字代表 2+目錄數。

如下

[[email protected] ~]# ll
total 32
drwxr-xr-x.  3 root root 4096 Sep 21 16:27 abc
-rw-------.  1 root root  900 Sep 21 03:28 anaconda-ks.cfg
-rw-r--r--.  1 root root 8815 Sep 21 03:28 install.log
-rw-r--r--.  1 root root 3384 Sep 21 03:27 install.log.syslog
-rw-r--r--.  1 root root 1796 Sep 21 15:38 profile
drwxr-xr-x. 10 root root 4096 Sep 21 16:05 x
[
[email protected]
~]# cd abc/ [[email protected] abc]# ll total 8 drwxr-xr-x. 2 root root 4096 Sep 21 16:26 a -rw-r--r--. 1 root root 4 Sep 21 16:27 b [[email protected] abc]# cd a [[email protected] a]# ll total 0

 abc是一個目錄,且目錄下有一個目錄 a ,有一個檔案b ,所以abc 那裡顯示的是 2+1 = 3 ,而目錄a是一個空目錄,所以a顯示的就是2,而普通檔案顯示的為1.

type

通過type -a command 可以檢視一個 命令所指向的程式所在的路徑

如下

[[email protected] ~]# type -a ifconfig
ifconfig is /sbin/ifconfig   # 告訴我們ifconfig程式在 /sbin/ifconfig目錄下

向ifconfig這種 返回一個路徑,說明ifconfig是一個第三方的程式,並不是linux自帶的。稱為外部命令

[[email protected] ~]# type cd
cd is a shell builtin    

它說 cd 命令 是一個 builtin ,意思就是說這是一個linux 整合的命令。稱為內部命令

shell  代表該命令處於 人機互動層,比如這種命令列或windows下點選圖示都稱為shell

file

用來檢視檔案型別

如下

[[email protected] ~]# file /sbin/ifconfig
/sbin/ifconfig: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

ELF 代表二進位制可執行檔案

[[email protected] ~]# type yum
yum is hashed (/usr/bin/yum)
[[email protected] ~]# file /usr/bin/yum 
/usr/bin/yum: a /usr/bin/python script text executable

通過上面命令可以看出 yum 是一個python指令碼,那麼一個python指令碼並不是一個可執行程式,那麼它是怎麼執行的呢?

 我們 使用  vi /usr/bin/yum 命令來檢視一下這個python指令碼的內容,可以看到如下內容

注意第一行,意思是使用 /usr/bin/下的python來執行該指令碼,那麼我們來看一下這個python到底 是不是一個二進位制的可執行檔案

[[email protected] bin]# file python
python: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for G

可以看出,是一個二進位制可執行檔案。 這個python程式會將 python腳本里的內容一邊解釋為cpu能讀懂的東西,一邊執行。 

yum

安裝外部程式

[[email protected] ~]# yum install man -y
[[email protected] ~]# yun install man-pages

-y  代表同意安裝,沒有 -y 還會詢問一次是否確定安裝 

man

看一個外部程式的幫助文件

[[email protected] ~]# man ifconfig

 man命令可以檢視下面幾種型別的幫助文件

 

 可以通過 

[[email protected] ~]# man 8 ifconfig

 檢視

help

看一個內部程式的幫助文件

[[email protected] ~]# help cd

ehco

在螢幕上顯示字串

$用於提取指定內容

下面 輸出的是環境變數,環境變數配置的是可執行程式的所在的目錄。bash會根據這些目錄去找到可執行檔案,從而響應使用者輸入的命令,要注意的是bash會從左向右去查詢,查詢到了就會執行。所以不存在相同的可執行程式想執行哪個就執行哪個。

[[email protected] bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

下面的命令可以輸出bash程式的程序號 

[[email protected] dev]# echo $$
1557

df

檢視磁碟使用情況,以及磁碟掛載目錄情況

[[email protected] grub]# df
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/sda3      100944296 834348  94982220   1% /
tmpfs             502204      0    502204   0% /dev/shm
/dev/sda1         198337  27810    160287  15% /boot
[[email protected] grub]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  815M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       194M   28M  157M  15% /boot

可以看出sda3 也就是我們之前 用來存放 自己安裝的程式的磁碟掛載了在 根目錄下

sda1 用來引導系統啟動的磁碟掛載在了 根目錄下的 boot 目錄下

這裡說一下 linux中的 目錄和分割槽的對應關係,linux 根目錄下的 所有資料夾是固定的,也就是你安裝好以後就肯定存在那些資料夾,而我們安裝centOS的時候進行的手動分割槽,實際上是將 分割槽指定掛載到某個目錄下。

這種設計增強了可移植性。不像winows你寫個程式碼,從E盤讀取某個檔案,把程式碼放別人電腦上,但別人電腦可能都沒有E盤。

linux能夠保證目錄的一致性,就是所有人安裝完linux系統 ,根目錄下的目錄都是一致的。

windows是在分割槽即不同磁碟中建立的目錄,而linux是將分割槽掛載到目錄下。然後目錄又一樣。

linux系統啟動的過程大致如下

通電以後主機板裡有一個 bios(basic input output system) ,bios中有一段程式碼放入記憶體執行。 從而會指向引導系統的裝置如優盤、硬碟 等。預設都是硬碟。讀取硬碟前512位元組(讀的分割槽表),載入程式放入記憶體,執行程式 , 找到活動分割槽 , 就是 boot 分割槽,分割槽起始位置讀取固定位元組數(把小程式再存入記憶體) , 然後就把這第一個分割槽(boot分割槽)算作 根 ,從boot下再讀取配置檔案 、核心檔案 讀到記憶體裡,從而給cpu reset指令,使核心接管硬體。核心接管硬體以後,cpu再讀取的資料,就是從核心展開的指令裡面讀。然後重新掛載根目錄,掛載的是sda3。然後會執行sbin中init程式(第一個程式)用來完成作業系統的初始化即安裝各種軟體,最終bash程式載入起來,我們就可以通過命令列進行人機互動了。

檢視個檔案來理解

[[email protected] boot]# vi /boot/grub/grub.conf 

這個檔案表明了 引導系統重要檔案的位置, 它說是在根目錄下,但實際這兩個檔案是在 boot目錄下。之所以這樣是因為在載入核心之前,boot分割槽就是根目錄,只不過是載入完核心一個給cpu一個reset指令使其重新將sda3掛載到了根目錄。然後再通過mount 將 sda1掛載到 boot目錄下

mount和umout

通過

[[email protected] /]# umount /boot/

將掛載移除

[[email protected] /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  815M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm

可以看到 sda1 的對應關係就沒有了

[[email protected] /]# ll
total 92
dr-xr-xr-x.  2 root root  4096 Sep 21 03:27 bin
drwxr-xr-x.  2 root root  4096 Sep 21 03:25 boot
drwxr-xr-x. 18 root root  3700 Sep 21 06:01 dev
drwxr-xr-x. 61 root root  4096 Sep 21 09:29 etc
drwxr-xr-x.  2 root root  4096 Sep 23  2011 home
dr-xr-xr-x.  8 root root  4096 Sep 21 03:27 lib
dr-xr-xr-x.  9 root root 12288 Sep 21 03:27 lib64
drwx------.  2 root root 16384 Sep 21 03:25 lost+found
drwxr-xr-x.  2 root root  4096 Sep 23  2011 media
drwxr-xr-x.  2 root root  4096 Sep 23  2011 mnt
drwxr-xr-x.  2 root root  4096 Sep 23  2011 opt
dr-xr-xr-x. 85 root root     0 Sep 21 06:00 proc
dr-xr-x---.  2 root root  4096 Sep 21 07:56 root
dr-xr-xr-x.  2 root root 12288 Sep 21 03:27 sbin
drwxr-xr-x.  7 root root     0 Sep 21 06:00 selinux
drwxr-xr-x.  2 root root  4096 Sep 23  2011 srv
drwxr-xr-x. 13 root root     0 Sep 21 06:00 sys
drwxrwxrwt.  3 root root  4096 Sep 21 08:38 tmp
drwxr-xr-x. 13 root root  4096 Sep 21 03:26 usr
drwxr-xr-x. 17 root root  4096 Sep 21 03:26 var
[[email protected] /]# cd /boot/
[[email protected] boot]# ll
total 0

可以看到 boot 目錄存在,但是裡面的內容沒了。

通過

[[email protected] dev]# mount /dev/sda1 /boot

將 dev 下的 sda1磁碟 掛載到 /boot 目錄下 

[[email protected] boot]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  815M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       194M   28M  157M  15% /boot
[[email protected] dev]# cd /boot/
[[email protected] boot]# ll
total 21672
-rw-r--r--. 1 root root   105195 Nov 22  2013 config-2.6.32-431.el6.x86_64
drwxr-xr-x. 3 root root     1024 Sep 21 03:27 efi
drwxr-xr-x. 2 root root     1024 Sep 21 09:28 grub
-rw-------. 1 root root 15221168 Sep 21 03:28 initramfs-2.6.32-431.el6.x86_64.img
drwx------. 2 root root    12288 Sep 21 03:25 lost+found
-rw-r--r--. 1 root root   193758 Nov 22  2013 symvers-2.6.32-431.el6.x86_64.gz
-rw-r--r--. 1 root root  2518236 Nov 22  2013 System.map-2.6.32-431.el6.x86_64
-rwxr-xr-x. 1 root root  4128368 Nov 22  2013 vmlinuz-2.6.32-431.el6.x86_64

又可以看到內容了。

du

檢視目錄佔用空間

-h 單位換算、-s 求和      後面再接路徑代表檢視指定檔案所佔大小

[[email protected] etc]# du -hs ./*

useradd

新增使用者,新增的使用者會存在home資料夾下,以檔案的形式展示

[[email protected] etc]# useradd zzh
[[email protected] etc]# cd /home/
[[email protected] home]# ll
total 12
drwx------. 2 god  god  4096 Sep 21 13:24 god
drwx------. 2 good good 4096 Sep 21 13:24 good
drwx------. 2 zzh  zzh  4096 Sep 21 14:50 zzh

cd

cd ~  進入當前目錄

[[email protected] home]# cd ~

cd ~ 其他使用者名稱  和  cd/home/其他使用者名稱               進入其他使用者目錄

[[email protected] ~]# cd ~god
[[email protected] god]# cd /home/good/
[[email protected] good]# 

mkdir

建立目錄

平行建立多個目錄

[[email protected] ~]# mkdir ./x/1dir ./x/2dir ./x/3dir
[[email protected] ~]# ls
abc  anaconda-ks.cfg  install.log  install.log.syslog  x
[[email protected] ~]# cd x
[[email protected] x]# ls
1dir  2dir  3dir  y

花括號優化  , 分號 分割命令

[[email protected] x]# cd;mkdir ./x/{a,b,c}dir
[[email protected] ~]# ls
abc  anaconda-ks.cfg  install.log  install.log.syslog  x
[[email protected] ~]# cd x
[[email protected] x]# ls
1dir  2dir  3dir  adir  bdir  cdir  y

-p 遞迴建立多個目錄

[[email protected] ~]# ls
abc  anaconda-ks.cfg  install.log  install.log.syslog  x
[[email protected] ~]# cd x
[[email protected] x]# cd y
[[email protected] y]# cd z

rm

刪除

-r  遞迴刪除

-f  刪除不詢問是否確定刪除

[[email protected] tmp]# rm x
rm: cannot remove `x': Is a directory
[[email protected] tmp]# rm -r x
rm: descend into directory `x'? ^C
[[email protected] tmp]# rm -rf x
[[email protected] tmp]# ls
yum.log

cp 

拷貝 檔案

-r 遞迴拷貝

[[email protected] ~]# cp x /tmp
cp: omitting directory `x'
[[email protected] ~]# cp -r x /tmp

mv

移動檔案且可以改名

[[email protected] zzh]# mv /tmp/p /home/zzh/x
[[email protected] zzh]# ls
x
[[email protected] zzh]# ls
x
[[email protected] zzh]# mv x p
[[email protected] zzh]# ls
p

ln

新增連結,類似windows中的快捷方式,連結分為軟連線和硬連結

硬連結   ln  原檔名  連結名

[[email protected] ~]# ll
total 32
drwxr-xr-x.  2 root root 4096 Sep 21 15:00 abc
-rw-------.  1 root root  900 Sep 21 03:28 anaconda-ks.cfg
-rw-r--r--.  1 root root 8815 Sep 21 03:28 install.log
-rw-r--r--.  1 root root 3384 Sep 21 03:27 install.log.syslog
-rw-r--r--.  1 root root 1796 Sep 21 15:38 profile
drwxr-xr-x. 10 root root 4096 Sep 21 16:05 x
[[email protected] ~]# ln profile xyz
[[email protected] ~]# ll -i
total 36
1310732 drwxr-xr-x.  2 root root 4096 Sep 21 15:00 abc
1310729 -rw-------.  1 root root  900 Sep 21 03:28 anaconda-ks.cfg
1310722 -rw-r--r--.  1 root root 8815 Sep 21 03:28 install.log
1310723 -rw-r--r--.  1 root root 3384 Sep 21 03:27 install.log.syslog
1310742 -rw-r--r--.  2 root root 1796 Sep 21 15:38 profile
1310733 drwxr-xr-x. 10 root root 4096 Sep 21 16:05 x
1310742 -rw-r--r--.  2 root root 1796 Sep 21 15:38 xyz

ls -l -i  通過 i  可以檢視 檔案地址, 可以看到 xyz 和 profile 的地址指向是一樣的。以及 ll -i 輸出內容中profile和xyz的第三個欄位 是 2. 

軟連線    

ln -s 原始檔名 連結名

[[email protected] ~]# ln -s xyz aaa
[[email protected] ~]# ll -i
total 36
1310744 lrwxrwxrwx.  1 root root    3 Sep 21 16:33 aaa -> xyz
1310732 drwxr-xr-x.  2 root root 4096 Sep 21 16:31 abc
1310729 -rw-------.  1 root root  900 Sep 21 03:28 anaconda-ks.cfg
1310722 -rw-r--r--.  1 root root 8815 Sep 21 03:28 install.log
1310723 -rw-r--r--.  1 root root 3384 Sep 21 03:27 install.log.syslog
1310742 -rw-r--r--.  2 root root 1796 Sep 21 15:38 profile
1310733 drwxr-xr-x. 10 root root 4096 Sep 21 16:05 x
1310742 -rw-r--r--.  2 root root 1796 Sep 21 15:38 xyz

可以發現 軟連線的 第三個欄位數字為1, 原始檔和連結檔案所指向的地址也不一樣,一個是1310744一個是1310742.

並且軟連線檔案的 第一個字母是 l 。

刪除原始檔以後會提示 找不到原始檔

 

 無論是軟連線還是硬連結,改變連結檔案中的內容或原始檔內容,另一個都會跟著改變

stat

檢視檔案屬性

[[email protected] /]# stat /etc/profile
  File: `/etc/profile'
  Size: 1796      	Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d	Inode: 1179683     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-09-21 03:34:13.380600126 +0800
Modify: 2013-10-02 17:06:18.000000000 +0800
Change: 2018-09-21 03:26:39.649999827 +0800

Access 訪問該檔案的最後一次時間

Modify 修改該檔案內容的最後一次時間

Change  元檔案被改變的最後一次時間,什麼叫元檔案? 就是該檔案的大小被改變,許可權被改變等等都被稱做元檔案被改變。

touch

作用1 : 

touch 未存在檔名  建立該檔案

[[email protected] /]# cd opt/
[[email protected] opt]# ll
total 0
[[email protected] opt]# touch test
[[email protected] opt]# stat test 
  File: `test'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d	Inode: 2621442     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-09-21 16:51:37.114888038 +0800
Modify: 2018-09-21 16:51:37.114888038 +0800
Change: 2018-09-21 16:51:37.114888038 +0800

作用2:

touch  已存在檔名  重新整理 Acess、Modify、Change的三個時間到當前時間

[[email protected] opt]# stat test 
  File: `test'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d	Inode: 2621442     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-09-21 16:51:37.114888038 +0800
Modify: 2018-09-21 16:51:37.114888038 +0800
Change: 2018-09-21 16:51:37.114888038 +0800
[[email protected] opt]# touch test 
[[email protected] opt]# stat test 
  File: `test'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d	Inode: 2621442     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-09-21 16:54:03.108886546 +0800
Modify: 2018-09-21 16:54:03.108886546 +0800
Change: 2018-09-21 16:54:03.108886546 +0800