大數據之Linux 基礎

Linux 基礎

Linux 開始

虛擬機 Linux 準備工作

Linux 安裝步驟

  • 選擇稍後安裝

  • 網絡類型選擇 NAT

  • 修改最大磁盤大小(這裏最大磁盤大小指給虛擬機分配的,但不真正使用不是這麼多)

注意: Linux 版本根據自己的Linux 版本選擇。列如:我這用的是 CentOS-6.5-x86_64-minimal.iso,

所以選擇 Linux 版本時選擇時 Centos 64位

  • 添加 ISO 鏡像文件,之後開啓虛擬機即可
    1. 選擇編輯虛擬機設置

​ 2. 掛載 iso 鏡像文件

  • 虛擬機安裝配置(若特殊說明,則選擇默認即可)

    • 跳過磁盤檢查,否則磁盤檢查時間會很長

    • 語言、鍵盤都選擇英文即可。

    • 選擇第一個

    • 選擇 yes,discard any data

    • 自定義 Linux 虛擬機名稱

    • 選擇時區

    • 密碼設置要簡單、透明(大家都知道的,不屬於個人重要密碼)

    • 自定義磁盤分區

注意事項:

  1. VM 安裝選擇自定義安裝,便於之後的自定義硬件配置(如:磁盤大小等)
  2. 語言、鍵盤都選擇英文
  3. 時區選擇亞洲/上海
  4. 密碼設置要簡單透明
  5. 磁盤需要手動分區 boot(200MB) swap(2G) /(剩餘所有)

Linux 靜態 IP 設置

# 設置靜態 IP 
# 編輯   vi   /etc/sysconfig/network-scripts/ifcfg-eth0 
[root@node01 network-scripts]# cd /etc/sysconfig/network-scripts/
[root@node01 network-scripts]# vi ifcfg-eth0 

# ifcfg-eth0 網卡配置,使用打開後編輯,
# ONBOOT=on 開機自啓 
# BOOTPROTO=static 表示 IP 使用靜態IP
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.170.101
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
DNS1=144.144.144.144
DNS2=8.8.8.8



# 刪除 rm -f 70-persistent-net.rules 
# 70-persistent-net.rules  該文件的作用是將 IP 地址與 MAC 地址綁定
[root@node01 etc]# cd /etc/udev/rules.d/
[root@node01 rules.d]# ll
total 16
-rw-r--r--. 1 root root 316 Nov 22  2013 60-raw.rules
-rw-r--r--. 1 root root 789 Sep 21 19:33 70-persistent-cd.rules
-rw-r--r--. 1 root root 420 Sep 21 19:28 70-persistent-net.rules
-rw-r--r--. 1 root root  54 Dec  8  2011 99-fuse.rules
[root@node01 rules.d]# rm -f 70-persistent-net.rules 

# 關機 
poweroff 

# 修改主機名
[root@node01 ~]# vi /etc/sysconfig/network
# 編輯 network 文件
NETWORKING=yes
HOSTNAME=node01
Linux 網絡配置文件位置
文件位置 文件作用說明
/etc/sysconfig/network-scripts/ifcfg-eth0 配置靜態 IP 地址
/etc/udev/rules.d/70-persistent-net.rules 將 IP 地址與 MAC 地址綁定
/etc/sysconfig/network 配置主機名

使用 VM 軟件 記錄快照

Linux 關機和重啓命令

關機 重啓
poweroff reboot
init 0 init 6

Linux 常用命令

命令 作用
ls 顯示目錄內容 ll --i
pwd 顯示當前目錄的絕對路徑
cd 切換目錄
mkdir 文件夾 -p {}
cp 複製 -r
mv 移動
touch 創建文件夾、文件
type 命令名 查看指定命令的文件的存放位置 外部命令 & 內部命令
cat 查看文件內容
file 查看文件詳細信息 (ELF 表示二進制文件)
echo 回聲,打印標椎輸出
echo $PATH 查看環境變量路徑
echo $$ 當前shell的PID
help 查看內部命令
man 查看外部命令命令
whereis 定位命令位置
hash 查看 hash 表
ps -ef 查看當前進程信息
df -h 顯示文件系統使用情況[甩鍋]
du -h 查看某種文件使用狀況[甩鍋]
mount/unmout 掛載/卸載磁盤文件

ls 命令

文件類型:
-:普通文件 (f)
d: 目錄文件

​ b: 塊設備文件 (block)
​ c: 字符設備文件 (character)

​ l: 符號鏈接文件(symbolic link file)

​ p: 命令管道文件(pipe)
​ s: 套接字文件(socket)
文件權限:9位,每3位一組,3組 權限(U,G,O)每一組:rwx(讀,寫,執行), r–
文件硬鏈接的次數
文件的屬主(owner)
文件的屬組(group)
文件大小(size),單位是字節
時間戳(timestamp):最近一次被修改的時間
​ 訪問:access
​ 修改:modify,文件內容發生了改變
​ 改變:change,metadata,元數據

使用 ls 同時展示多個目錄

[root@node01 god]# ls ~  /usr/local
/root:
anaconda-ks.cfg  install.log  install.log.syslog

/usr/local:
bin  etc  games  include  lib  lib64  libexec  sbin  share  src

使用 mkdir 命令同時創建多個文件夾

[root@node01 c]# mkdir Hello/{a,b,c}A -p
[root@node01 c]# ll
total 4
drwxr-xr-x. 5 root root 4096 Sep 22 00:45 Hello
[root@node01 c]# cd Hello
[root@node01 Hello]# ll
total 12
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 aA
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 bA
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 cA

查看文件系統和文件使用情況

[root@node01 /]# du -h /etc/udev
4.0K	/etc/udev/makedev.d
20K	/etc/udev/rules.d
32K	/etc/udev
[root@node01 /]# df -h 
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  842M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       194M   28M  157M  15% /boot
/dev/sr0        398M  398M     0 100% /mnt

使用硬鏈接和軟鏈接

  • 硬鏈接類似於拷貝,即使原文件被刪除了,硬鏈接生成文件仍可使用
ln --l  原文件名 硬鏈接文件名
  • 軟鏈接,原文件刪除了,軟鏈接生成文件不可使用
ln -s 原文件名 軟鏈接文件名

安裝 man 命令

yum install man man-pages

Linux命令執行流程

​ 用戶通過客戶端命令行輸入命令以及命令參數, bash 解釋器會根據空白符切割,得到的第一個元素,作爲命令 command。通過判斷該 command 命令是外部命令還是內部命令,若內部命令,則由 bash 執行器直接執行。若是外部命令,則 根據 $PATH 中給定的目錄中從左向右尋找該命令文件的可執行程序文件,然後由 bash 執行器執行。

[root@node01 ~]# type ls
ls is aliased to `ls --color=auto'
[root@node01 ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
[root@node01 ~]# type ifconfig
ifconfig is /sbin/ifconfig
[root@node01 ~]# 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
[root@node01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@node01 ~]# type yum
yum is hashed (/usr/bin/yum)
[root@node01 ~]# file /usr/bin/yum
/usr/bin/yum: a /usr/bin/python script text executable

小技巧:使用 xshell 登錄 Linux ssh root:[email protected]

ssh 用戶名:密碼@IP地址

Linux 文件系統

boot 目錄的掛載與卸載

[root@node01 /]# umount /boot
[root@node01 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  842M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm
[root@node01 /]# mount /dev/sda1 /boot
[root@node01 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        97G  842M   91G   1% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       194M   28M  157M  15% /boot

File System Hierarchy Standard

文件系統層次化標準

目錄
/boot 系統啓動相關的文件,如內核、initrd,以及grub(bootloader)
/dev 設備文件
/etc 配置文件
/home 用戶的家目錄,每一個用戶的家目錄通常默認爲/home/USERNAME
/root 管理員的家目錄
/lib 庫文件
/media 掛載點目錄,移動設備
/mnt 掛載點目錄,額外的臨時文件系統
/opt 可選目錄,第三方程序的安裝目錄
/proc 僞文件系統,跟硬件設備相關的屬性映射文件
/sys 臨時文件, /var/tmp
/tmp 可變化的文件
/bin 可執行文件, 用戶命令
/sbin 管理命令

系統啓動必須:

  • **/boot:**存放的啓動Linux 時使用的內核文件,包括連接文件以及鏡像文件。

  • /etc:存放所有的系統需要的配置文件和**子目錄列表,**更改目錄下的文件可能會導致系統不能啓動。

  • /lib:存放基本代碼庫(比如c++庫),其作用類似於Windows裏的DLL文件。幾乎所有的應用程序都需要用到這些共享庫。

  • /sys: 這是linux2.6內核的一個很大的變化。該目錄下安裝了2.6內核中新出現的一個文件系統 sysfs 。sysfs文件系統集成了下面3種文件系統的信息:針對進程信息的proc文件系統、針對設備的devfs文件系統以及針對僞終端的devpts文件系統。該文件系統是內核設備樹的一個直觀反映。當一個內核對象被創建的時候,對應的文件和目錄也在內核對象子系統中

指令集合:

  • **/bin:**存放着最常用的程序和指令

  • **/sbin:**只有系統管理員能使用的程序和指令。

外部文件管理:

  • **/dev :**Device(設備)的縮寫, 存放的是Linux的外部設備。**注意:**在Linux中訪問設備和訪問文件的方式是相同的。

  • /media:類windows的**其他設備,**例如U盤、光驅等等,識別後linux會把設備放到這個目錄下。

  • /mnt:臨時掛載別的文件系統的,我們可以將光驅掛載在/mnt/上,然後進入該目錄就可以查看光驅裏的內容了。

臨時文件:

  • /run:是一個臨時文件系統,存儲系統啓動以來的信息。當系統重啓時,這個目錄下的文件應該被刪掉或清除。如果你的系統上有 /var/run 目錄,應該讓它指向 run。

  • /lost+found:一般情況下爲空的,系統非法關機後,這裏就存放一些文件。

  • /tmp:這個目錄是用來存放一些臨時文件的。

賬戶:

  • /root:系統管理員的用戶主目錄。

  • /home:用戶的主目錄,以用戶的賬號命名的。

  • /usr:用戶的很多應用程序和文件都放在這個目錄下,類似於windows下的program files目錄。

  • **/usr/bin:**系統用戶使用的應用程序與指令。

  • **/usr/sbin:**超級用戶使用的比較高級的管理程序和系統守護程序。

  • **/usr/src:**內核源代碼默認的放置目錄。

運行過程中要用:

  • /var:存放經常修改的數據,比如程序運行的日誌文件(/var/log 目錄下)。

  • /proc:管理**內存空間!**虛擬的目錄,是系統內存的映射,我們可以直接訪問這個目錄來,獲取系統信息。這個目錄的內容不在硬盤上而是在內存裏,我們也可以直接修改裏面的某些文件來做修改。

擴展用的:

  • /opt:默認是空的,我們安裝額外軟件可以放在這個裏面。

  • /srv:存放服務啓動後需要提取的數據**(不用服務器就是空)**

掛載 cdrom 到 /mnt 目錄下

mount /dev/cdrom  /mnt

文本操作命令

command 作用
cat 顯示全部文本文件內容
more 逐頁顯示文本文件內容
less 一次性讀取全部文件內容,相比more,可以往回看
head 顯示前 n 行的內容
tail 顯示後 n 行的內容
| 管道
xargs

使用 head 和 tail 命令遍歷每行

[root@node01 god]# cat profile | head -3 | tail -1
# System wide environment and startup programs, for login setup

xargs 用法

[root@node01 god]# echo "/"  |xargs ls -l
total 90
dr-xr-xr-x.  2 root root  4096 Sep 21 19:29 bin
dr-xr-xr-x.  5 root root  1024 Sep 21 19:29 boot
drwxr-xr-x. 18 root root  3680 Sep 21 22:21 dev
# ....

vi 全屏文本編輯器

打開方式

vim /path/to/somefile
vim +# :打開文件,並定位於第#行 
vim +:打開文件,定位至最後一行
vim +/PATTERN : 打開文件,定位至第一次被PATTERN匹配到的行的行首

關閉文件

末行模式:
:q  退出  沒有動過文件 
:wq 保存並退出   動過了,不後悔
:q! 不保存並退出  動過了,後悔了
:w 保存
:w! 強行保存
:wq --> :x

ZZ: 保存並退出   不需要冒號,編輯模式   # 重點*

三種模式

按鍵具有編輯文本功能:默認打開進入編輯模式
輸入模式:按鍵本身意義
末行模式:接受用戶命令輸入

  • 編輯模式

    #編輯-->輸入:
    	i: 在當前光標所在字符的前面,轉爲輸入模式;*
    	a: 在當前光標所在字符的後面,轉爲輸入模式;*
    
    	o: 在當前光標所在行的下方,新建一行,並轉爲輸入模式;
    	O:在當前光標所在行的上方,新建一行,並轉爲輸入模式;	
    	I:在當前光標所在行的行首,轉換爲輸入模式
    	A:在當前光標所在行的行尾,轉換爲輸入模式
    	輸入-->編輯:
    ESC
    #編輯-->末行:#末行-->編輯:
    ESC, ESC
    
    
    #移動光標
    字符
    h: 左;j: 下;k: 上;l: 右
    # 單詞
    w: 移至下一個單詞的詞首*
    e: 跳至當前或下一個單詞的詞尾
    b: 跳至當前或前一個單詞的詞首
    # 行內
    0: 絕對行首
    ^: 行首的第一個非空白字符*
    $: 絕對行尾*
    # 行間
    G:文章末尾
    3G:第3行
    gg:文章開頭
    # 翻屏
    ctrl:f,b
    
    # 刪除&替換單個字符
    x:刪除光標位置字符
    3x:刪除光標開始3個字符
    r:替換光標位置字符
    # 刪除命令 : d 
    dw,dd
    # 複製粘貼&剪切	
    yw(複製一個詞),yy(複製一行)
    p(向下粘貼)
    P(向上粘貼)
    # 撤銷&重做
    u   撤銷*
    ctrl+r  重做 撤銷的操作*
    
    .  重複上一步的操作
    
  • 末行模式 (進入末行模式 shirt+: )

    set:設置
    set nu  number
    set nonu nonumber
    set readonly
    
    
    /:查找
    /after
    n(向下查找),N(向上查找)
    ?向上查找
    !:執行命令
    :!ls -l /
    
    s查找並替換
    s/str1/str2/gi
    /:臨近s命令的第一個字符爲邊界字符:/,@,#
    g:一行內全部替換(若沒有選擇,則替換當前行的第一個替換)
    i:忽略大小寫
    範圍
    n:行號
    .:當前光標行
    +n:偏移n行
    $:末尾行,$-3
    %:全文
    
    # 替換查找從當前光標處,到文件末尾處
    eg: .,$s/str1/str2/gi  
    

末行模式小技巧

編輯模式下 :
:Gd  清空內容
:.,$d 刪除從當前光標到末尾所有行
:n,md 刪除從第 n 行到 m 行的所有內容
:n,my 複製從第 n 行到 m 行的所有內容

正則表達式

grep:顯示匹配行
- v:反顯示
- e:使用擴展正則表達式

匹配操作符
\                  轉義字符
. 	                 匹配任意單個字符
[1249a],[^12],[a-k]  字符序列單字符佔位
^                 行首
$                  行尾
\<,\>:\<abc           單詞首尾邊界*
|                   連接操作符
(,)              選擇操作符
\n    	     反向引用

重複操作符:
?      	匹配0到1次。
*      	匹配0到多次。
+     	匹配1到多次。
{n}   	匹配n次。
{n,}  	匹配n到多次。
{n,m}      匹配n到m次。
與擴展正則表達式的區別:grep basic
\?, \+, \{, \|, \(, and \)
匹配任意字符
.*

注意:在未擴展正則表達式時,若匹配規則中含有 ?,+,{,},|,(,) ,都需要通過 \ 轉義,否則匹配不到

查詢文章中包括4位整數的行

grep -E  "([^0-9][0-9]|^[0-9])([0-9]{2})([0-9][^0-9]|[0-9]$)"  grep.txt

查看指定單詞

grep “\<單詞名\>file

反向引用

[root@node01 god]# grep  -E ".*(god).*(good).*\2.*\1" test
asgodssgoodsssagoodssgod
[root@node01 god]# grep  -E ".*(god).*(good).*\1.*\2" test
asgodssgoodsssagodssgood 

文本處理

cut 命令

cut:顯示切割的行數據
f:選擇顯示的列
s:不顯示沒有分隔符的行
d:自定義分隔符

測試

[root@node01 god]# cut -d' ' -s  -f1-3 grep.txt 
ooxx 12121212
oox 12121212
1212 ooxx 1212
[root@node01 god]# cut -d' ' -f1,2,3 grep.txt 
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
oo1234xx
ooxyzxx

sort命令

sort:排序文件的行
n:按數值排序
r:倒序
t:自定義分隔符
k:選擇排序列
u:合併相同行
f:忽略大小寫
[root@node01 god]# sort  -k2 -n -r  fruits.txt 
orange--27
banana--15
apple--20
apple--20
[root@node01 god]# sort  -k2 -n -r fruits.txt 

wc 命令

wc 打印每個文件的換行數、單詞數和字節數
[root@node01 god]# wc fruits.txt 
 4  4 42 fruits.txt
[root@node01 god]# cat fruits.txt | wc
      4       4      42
[root@node01 god]# cat fruits.txt | wc -l
4

統計當前目錄中文件的個數

ls ./ | wc 

行編輯器

sed 命令

sed [options] 'AddressCommand' file ...
	-n: 靜默模式,不再默認顯示模式空間中的內容
	-i: 直接修改原文件*
	-e SCRIPT -e SCRIPT:可以同時執行多個腳本
	-f /PATH/TO/SED_SCRIPT
	-r: 表示使用擴展正則表達式*
	
d: 刪除符合條件的行;
p: 顯示符合條件的行;
a \string: 在指定的行後面追加新行,內容爲string*
\n:可以用於換行
i \string: 在指定的行前面添加新行,內容爲string*
r FILE: 將指定的文件的內容添加至符合條件的行處
w FILE: 將地址指定的範圍內的行另存至指定的文件中; 
s/pattern/string/修飾符: 查找並替換,默認只替換每行中第一次被模式匹配到的字符串*
g: 行內全局替換
i: 忽略字符大小寫
s///: s###, s@@@	
	\(\), \1, \2   *

sed:行編輯器Address
可以沒有 
給定範圍
查找指定行/str/

模糊匹配指定行,並替換

# id:9:initdefault:

sed "s/\(id:\)[0-9]\(:initdefault:\)/\19\2/" inittab 

模糊匹配 IP 地址,並替換最後的主機號

sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\1144/" ifcfg-eth0

[root@node01 god]# num=100
[root@node01 god]# sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-4]\|25[0-5]\)\.\)\{3\}\).*/\1$num/"  -i ifcfg-eth0 

注意: \. 表示真實的點,不作爲正則匹配中任意字符

awk 命令

awk是一個強大的文本分析工具。
相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。
簡單來說awk就是把文件逐行的讀入,(空格,製表符)爲默認分隔符將每行切片,切開的部分再進行各種分析處理。

awk -F '{pattern + action}' {filenames}
支持自定義分隔符
支持正則表達式匹配
支持自定義變量,數組  a[1]  a[tom]  map(key)
支持內置變量
ARGC               命令行參數個數
ARGV               命令行參數排列
ENVIRON            支持隊列中系統環境變量的使用
FILENAME           awk瀏覽的文件名
FNR                瀏覽文件的記錄數
FS                 設置輸入域分隔符,等價於命令行 -F選項
NF                 瀏覽記錄的域的個數*
NR                 已讀的記錄數*
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符
支持函數
print、split、substr、sub、gsub
支持流程控制語句,類C語言
if、while、do/while、for、break、continue
#--------------------------------------------------------------------------------#
只是顯示/etc/passwd的賬戶:CUT
awk -F':' '{print $1}' passwd
只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行開始前添加列名name,shell,在最後一行添加"blue,/bin/nosh"(cut,sed)
awk -F':' 'BEGIN{print "name,shell"} {print $1 "," $7} END{print "blue,/bin/nosh"}' passwd
搜索/etc/passwd有root關鍵字的所有行
awk  '/root/ { print $0}'   passwd

注意:

  1. $0 表示一整行內容

  2. 代碼塊{} 外加單引號,不能是雙引號,即 '{}'

  3. awk 默認以空白、TAB作爲分隔符 delimiter,即若以空白、TAB爲分隔號,不需要指定 -F參數

統計/etc/passwd文件中,每行的行號,每行的列數,對應的完整行內容

awk -F":" 'BEGIN{ print "NR\tNF\tContent" } {print NR "\t" NF "\t" $0 }' passwd 
# 結果
NR	NF	Content
1	7	root:x:0:0:root:/root:/bin/bash
2	7	bin:x:1:1:bin:/bin:/sbin/nologin
3	7	daemon:x:2:2:daemon:/sbin:/sbin/nologin
# ....

打印報表功能

# awk.txt
Tom	     0   2012-12-11      car     3000
John	 1   2013-01-13      bike    1000
vivi	 1   2013-01-18      car     2800
Tom	     0   2013-01-20      car     2500
John	 1   2013-01-28      bike    3500


# awk.sh
{
        split($3,date,"-")
        if(date[2] == "01"){
                name[$1] += $5  #把名字作爲數組下標,對應的value爲工資
        }
        if($2 == "0"){
                role[$1] = "manager"
        }else{
                role[$1] = "worker"
        }
}
END{
        for (i in name){
                print i "\t" role[i] "\t" name[i]
        }
}

#  使用
[root@node01 god]# awk -f awk.sh awk.txt 
vivi	worker	2800
Tom	manager	2500
John	worker	4500

Linux 用戶管理

命令 說明
id 打印輸出有效用戶的自身的ID 和 所在組的 ID
useradd 添加用戶
userdel 刪除用戶
groupadd 添加組
groupdel 刪除組
passwd 設置或修改密碼
sudo * 提升權限
su 切換用戶

刪除用戶

若要刪除用戶,再創建同名用戶,需要在創建前刪除原 /home 目錄和 /var/mail 目錄下的內容

[root@node01 /]# userdel god
[root@node01 /]# useradd god
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@node01 /]# rm -rf /home/god/
[root@node01 /]# useradd god
useradd: user 'god' already exists
[root@node01 /]# rm -fr /var/
cache/    empty/    lib/      lock/     mail/     opt/      run/      tmp/      
db/       games/    local/    log/      nis/      preserve/ spool/    yp/       
[root@node01 /]# rm -fr /var/mail/god 
[root@node01 /]# useradd god

權限

命令 說明
r 讀權限 r=4
w 寫權限 w=2
x 可執行權限 x=1
usermod 修改用戶權限
chown 修改文件的屬主和屬組
chmod 修改文件操作權限 (RWX) augo

注意:

  1. 一個文件只能有一個屬主和一個屬組

  2. 文件夾的執行權限 x ,表示用戶是否可以進入到該文件夾下

useradd sxt01
passwd sxt01
useradd sxt02
passwd sxt02

mkdir /var/swapdata
1,權限修正:
chmod  770  swapdata   |  chmod  o-rwx g+rwx   swapdata
2,修正屬組
groupadd sxtswap
usermod -a -G sxtswap sxt01
usermod -a -G sxtswap sxt02
chown  root:sxtswap swapdata
chown :sxtswap   ooxx.file
chmod  770 ooxx.file
id  username

Linux 編譯安裝

執行順 說明
./configure 生成編譯依賴關係
make 編譯
make install 新建文件夾、拷貝文件
1,下載源碼包
2,解壓縮:tar xf filename
3,cd:vi README
4,./configure
檢查操作系統
檢查編譯環境
yum install gcc
pcre 依賴庫
yum search pcre
yum install pcre-devel
openssl
yum install opssl-devel
./configure --help
./configure --prefix=/opt/sxt/nginx   #配置安裝路徑
5,Makefile
6,make
7,make install
8,cd /opt/sxt/nginx/sbin     ./nginx
9,瀏覽器訪問測試
10,祝君好運~!

Linux RPM 安裝

Redhat提供了rpm管理體系
已經編譯的軟件包:針對不同的平臺系統編譯目標軟件包
操作系統維護安裝信息
軟件包包含依賴檢查,但還需人爲解決

安裝 rpm 軟件

rpm -ivh  xxxx.rpm

rpm 命令使用

rpm安裝:
-ivh  filename
--prefix
rpm升級:
-Uvh
-Fvh
rpm卸載:
-e PACKAGE_NAME

# rpm查詢
rpm -qa : 查詢已經安裝的所有包
rpm -q  PACKAGE_NAME: 查詢指定的包是否已經安裝
rpm -qi PACKAGE_NAME: 查詢指定包的說明信息
rpm -ql PACKAGE_NAME: 查詢指定包安裝後生成的文件列表
rpm -qc PACEAGE_NEME:查詢指定包安裝的配置文件
rpm -qd PACKAGE_NAME: 查詢指定包安裝的幫助文件
rpm -q --scripts PACKAGE_NAME: 查詢指定包中包含的腳本	
rpm -qf /path/to/somefile: 查詢文件是由哪個rpm包安裝生成的	
如果某rpm包尚未安裝,需查詢其說明信息、安裝以後會生成的文件
rpm -qpi /PATH/TO/PACKAGE_FILE
rpm -qpl 

Linux YUM 安裝

yum 命令

yum命令:
yum repolist
yum clean all
yum makecache
yum update
查詢:
yum list
yum search
yum info
安裝&卸載:
yum install 
remove|erase

yum命令:分組
yum grouplist
yum groupinfo
yum groupinstall
yum groupremove
yum groupupdate

更換安裝爲阿里源

# 備份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下載阿里 yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

# 更新緩存
yum makecache

本地 yum 源

  1. 爲當前虛擬機掛載鏡像文件

  1. 操作
# 掛載 cdrom 
mount /dev/cdrom /mnt

repo:
/etc/yum.repos.d/
[repoID]
baseurl=
http://
file://
ftp://
#gpgchkeck= 有1和0兩個選擇,分別代表是否是否進行gpg校驗,如果沒有這一項,默認是檢查的。 
gpgcheck=1/0
#當某個軟件倉庫被配置成 enabled=0 時,yum 在安裝或升級軟件包時不會將該倉庫做爲軟件包提供源。使用這個選項,可以啓用或禁用軟件倉庫。  
enable=0/1

#[base]
name=local
failovermethod=priority
baseurl=file:///mnt
gpgcheck=1
enable=1

注意: 若包名中間包括空格,一定使用雙引號括起來

中文顯示,查看中文文檔

# yum 的 repo 變成aliyun  || 本地DVD
yum grouplist
yum groupinstall "Chinese Support"
echo $LANG
en_US.UTF-8
LANG=zh_CN.UTF-8

#增加epel的repo:
http://mirrors.aliyun.com
epel>>>>>help
wget centos6.......

yum clean all
yum makecache
yum search man-pages
yum install man man-pages man-pages-zh-CN
【【【【 man bash 】】】】

文本流

變量
引用&命令替換
退出狀態&邏輯判斷
表達式
流程控制

重定向:不是命令
程序自身都有I/O
0:標準輸入
1:標準輸出
2:錯誤輸出
控制程序I/O位置
一切皆文件
/proc/$$/fd
程序是否處理I/O?
綁定順序:從左到右

輸出重定向

輸出重定向 說明
1>xxx 標準輸出覆蓋重定向
1>>xxx 標準輸出追加重定向
2>xxx 錯誤覆蓋重定向
2>>xxx 錯誤追加重定向
>&或者&> xxx 向 xxx 文件添加錯誤和標準輸出信息

注意: 重定向符號左邊都不能包括空格

[root@node01 god]# ls /yy 2>error
[root@node01 god]# ll
total 8
-rw-r--r--. 1 root root 140 Sep 22 22:39 a
-rw-r--r--. 1 root root  49 Sep 22 22:40 error
[root@node01 god]# cat error 
ls: cannot access /yy: No such file or directory
[root@node01 god]# ls /123 2>>error
[root@node01 god]# cat error
ls: cannot access /yy: No such file or directory
ls: cannot access /123: No such file or directory


[root@node01 god]# ls / /suibian 1>ls02.out 2>&1
[root@node01 god]# cat ls02.out
ls: cannot access /suibian: No such file or directory
/:
abc
bin
# ... 省略
[root@node01 god]# ls / /suibian >& ls01.out
[root@node01 god]# cat ls01.out 
ls: cannot access /suibian: No such file or directory
/:
abc
bin
boot
# ... 省略

注意: 若一條命令中既包括錯誤輸出,也包括正確輸出,則先輸出錯誤輸出

輸入重定向

輸入重定向 說明
<<< 從字符串中讀取輸入
<<E 從鍵盤中讀取輸入,E表示結束符
< 從文件中讀取輸入
[root@node01 god]# read aaa <<<"HelloWord"
[root@node01 god]# echo $aaa
HelloWord
[root@node01 god]# read aaa<<GG
> ljasf
> ajlsdfj;la
> ;ajdfkl
> GG  #跟 GG 一樣,表示輸入退出
[root@node01 god]# echo $aaa
ljasf

# input.sh 腳本
cat <<AABB
print error info
AABB
echo "you know me .."
# 執行
source input.sh

[root@node01 god]# cat 0< /etc/in
init/    init.d/  inittab  inputrc  
[root@node01 god]# cat 0< /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

全重定向

exec 8<> /dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.0\n" >& 8
cat <& 8

Shell 編程

bash

shell  bash
解釋器,啓動器
解釋器:
用戶交互輸入
文本文件輸入*
腳本本質:
#! /bin/bash
#! /usr/bin/python
讀取方式:
當前shell:source/.
新建子shell:/bin/bash  file   /   ./file.sh  《chmod +x file.sh》
執行方式 說明
source xxx.sh 在當前 bash 中執行腳本
./xxx.sh 開啓一個子 bash 執行腳本

注意:在不同 bash 中執行的結果有可能不相同,即要理清父子 bash 之間的關係

[root@node01 sh]# echo $$
1132
[root@node01 sh]# source sh01.sh 
abc  boot  etc   lib    lost+found  mnt  proc  sbin     share  sys  usr
bin  dev   home  lib64  media       opt  root  selinux  srv    tmp  var
Hello World
1132
init─┬─auditd───{auditd}
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     └─udevd───2*[udevd]
[root@node01 sh]# ./sh01.sh 
abc  boot  etc	 lib	lost+found  mnt  proc  sbin	share  sys  usr
bin  dev   home  lib64	media	    opt  root  selinux	srv    tmp  var
Hello World
1296
init─┬─auditd───{auditd}
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───bash───pstree
     └─udevd───2*[udevd]

變量

類型 作用
本地變量 作用於當前 bash 中
局部變量 local,只作用於當前代碼塊
位置變量 $1,$2,,從腳本文件後,讀取參數
特殊變量 $#: 位置參數個數
$*: 參數列表,雙引號引用爲一個字符串
$@: 參數列表,雙引號引用爲單獨的字符串
$$:當前 shell 的 PID:接收者
$BASHPID:真實
管道 *
$?:上一個命令退出狀態
- 0 成功
-other: 失敗
環境變量 - export 定義變量
- 導出到子 shell
- fork() Copy On Write 時間複雜度 O(1)
適用用於函數
unset: 取消變量
set: 查看shell 的變量
[root@node01 sh]# num=1
[root@node01 sh]# myfunc(){
> echo $num
> echo HelloWorld
> }
[root@node01 sh]# myfunc
1
HelloWorld


# 本地變量 local
[root@node01 sh]# myfunc(){
> local fun=1
> echo $fun
> echo ok
> }
[root@node01 sh]# myfunc
1
ok
[root@node01 sh]# echo $fun

# -------------------------------
# 位置參數
[root@node01 sh]# cat sh02.sh
echo $1
echo $2
[root@node01 sh]# vi sh02.sh
[root@node01 sh]# source sh02.sh 1 2 
1
2


# 特殊參數
[root@node01 sh]# cat sh02.sh 
echo $1
echo $2
echo ${11}
echo "---------"
echo {'position parameters:'}$#
echo $@
[root@node01 sh]# source sh02.sh a b c d e f j h k m n o
a
b
n
---------
{position parameters:}12
a b c d e f j h k m n o

#查看上一個命令的執行狀態
[root@node01 sh]# ls /
abc  bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  share  srv  sys  tmp  usr  var
[root@node01 sh]# echo $?
0
[root@node01 sh]# ls /asf
ls: cannot access /asf: No such file or directory
[root@node01 sh]# echo $?
2

# 數組使用
[root@node01 sh]# arr=(1 2 3)
[root@node01 sh]# echo $arr[1]
1[1]
[root@node01 sh]# echo ${arr[1]}
2
[root@node01 sh]# echo ${arr[0]}
1
[root@node01 sh]# echo ${arr[2]}
3

# 變量與其他字符串的拼接,需要使用花括號 {},標識爲變量
[root@node01 sh]# num=1
[root@node01 sh]# echo $num1231

[root@node01 sh]# echo ${num}111
1111

# 管道--管道兩邊分爲在兩個子 bash 中,  子 bash 可以使用父 bash 中的引用
[root@node01 sh]# dd=1
[root@node01 sh]# dd=10 | echo $dd
1

# export 導入不共享
[root@node01 sh]# cat sh04.sh 
echo $k
echo "-------------"
sleep 10
echo $k
[root@node01 sh]# export k=5
[root@node01 sh]# ./sh04.sh &  # $ 表示在後臺運行
[1] 1729
[root@node01 sh]# 5
-------------
^C
[root@node01 sh]# k=8
[root@node01 sh]# 5
^C
[1]+  Done                    ./sh04.sh

注意:

  1. 數組元素之間通過空格分隔,使用逗號分號,bash 會把數組整體當做字符串使用
  2. export 導出非共享

引用

雙引號:弱引用,參數擴展
單引號:強引用,不可嵌套
花括號擴展不能被引用
命令執行前刪除引用

[root@node01 sh]# kk=12
[root@node01 sh]# echo "$kk"
12
[root@node01 sh]# echo '$kk'
$kk
# 花括號擴展不能被引用
[root@node01 b]# cp  "/etc/{passwd,inittab}" ./
cp: cannot stat `/etc/{passwd,inittab}': No such file or directory

命令替換

反引號:`ls -l /`
$(ls -l /)
可以嵌套
[root@node01 sh]# echo "`echo 123`"
123

[root@node01 sh]# abc=$(echo $(echo "sxt"))
[root@node01 sh]# echo $abc
sxt

[root@node01 sh]# abc=$(ls -l /)
[root@node01 sh]# echo $abc
total 98 drwxrw-r-x. 3 root root 4096 Sep 22 13:53 abc dr-xr-xr-x. 2 root root 4096 Sep 22 21:34 bin dr-xr-xr-x. 5 root root 1024 Sep 21 19:29 boot drwxr-xr-x. 18 root root 3680 Sep 22 21:45 dev drwxr-xr-x. 76 root root 4096 Sep 22 21:45 etc drwxr-xr-x. 4 root root 4096 Sep 22 13:04 home dr-xr-xr-x. 8 root root 4096 Sep 22 14:16 lib dr-xr-xr-x. 10 root root 12288 Sep 22 21:34 lib64 drwx------. 2 root root 16384 Sep 21 19:28 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. 87 root root 0 Sep 22 21:45 proc dr-xr-x---. 5 root root 4096 Sep 23 03:26 root dr-xr-xr-x. 2 root root 12288 Sep 22 17:58 sbin drwxr-xr-x. 7 root root 0 Sep 22 21:45 selinux drwxrwx---. 2 root share 4096 Sep 22 13:51 share drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv drwxr-xr-x. 13 root root 0 Sep 22 21:45 sys drwxrwxrwt. 3 root root 4096 Sep 23 02:02 tmp drwxr-xr-x. 14 root root 4096 Sep 22 17:50 usr drwxr-xr-x. 17 root root 4096 Sep 21 19:28 var

邏輯判斷*

退出狀態
echo $?
邏輯判斷
command1 && command2
command1 || command2

表達式

算術表達式

let  算術運算表達式
let  C=$A+$B
$[算術表達式]
C =$[$A+$B]
$((算術表達式))
C=$(($A+$B))
expr  算術表達式  
注意:表達式中各操作數及運算符之間要有空格。而且要使用命令引用
C=`expr $A + $B`
help let
[root@node01 sh]# a=1
[root@node01 sh]# b=2
[root@node01 sh]# let c=$a+$b
[root@node01 sh]# echo $c
3
[root@node01 sh]# c=3
[root@node01 sh]# d=4
[root@node01 sh]# e=$(($c+$d))
[root@node01 sh]# echo $e
7
[root@node01 sh]# j=1
[root@node01 sh]# k=2
[root@node01 sh]# c=$((j+k))
[root@node01 sh]# echo $c
3

[root@node01 sh]# echo $a
2
[root@node01 sh]# ((a++))
[root@node01 sh]# echo $a
3

條件表達式

[  expression  ]
test expression
[[ expression ]]
help test
[root@node01 sh]# test -a /etc/adf
[root@node01 sh]# echo $?
1
[root@node01 sh]# test -a /etc/password
[root@node01 sh]# echo $?
1

[root@node01 sh]# [ $a -gt $b ]
[root@node01 sh]# echo $?
0

[root@node01 sh]# [3 -gt 2]
-bash: [3: command not found
[root@node01 sh]# [ 3 -gt 2 ]
[root@node01 sh]# echo $?
0

注意: 靠近 [] ,需要有空格間隔

添加用戶腳本

#添加用戶
#用戶密碼同用戶名
#靜默運行腳本
#避免捕獲用戶接口
#程序自定義輸出


#! /bin/bash
[ ! $# -eq 1 ] && echo "args error ! " && exit 3
id $1 >&/dev/null && echo "user exits" && exit 4
useradd $1 >& /dev/null && echo $1 | passwd --stdin $1 >& /dev/null && echo "useradd user success!" && exit 0
echo "don't know, user add error!"

流程控制

if

[test06@node01 sh]$ if [ 3 -gt 1 ]; then echo ok; fi
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ b=2
[test06@node01 sh]$ if [ $b -lt $a ];then echo ok;elif [ $b -gt $a ];then echo ojbk;fi
ojbk
[test06@node01 sh]$ if [ $b -lt $a ];then echo lt;else echo gt;fi
gt

while

[test06@node01 sh]$ while ls /;do echo ok;break;done
abc  boot  etc   lib    lost+found  mnt  proc  sbin     share  sys  usr
bin  dev   home  lib64  media       opt  root  selinux  srv    tmp  var
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ while [ $a -le 5 ];do echo $a;((a++));done
1
2
3
4
5

for

[test06@node01 sh]$ for ((ab=1;ab<5;ab++));do echo ab=$ab;done
ab=1
ab=2
ab=3
ab=4
[test06@node01 sh]$ for i in 1 2 3 4 5;do echo $i;done
1
2
3
4
5
# 用戶給定路徑
# 輸出文件大小最大的文件
# 遞歸子目錄
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
for i in `du -a $1 | sort -nr`;do
        filename=`echo $i | awk '{print $2}'`
        if [ -f $filename ];then
                echo $filename
                break;
        fi
done
IFS=$oldIFS

注意: 變量的賦值等於號前面兩邊不能有空格,bash 對空格敏感

循環遍歷文件輸出

#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
        echo $i
        ((num++));
done
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
        echo $i
        ((num++));
done
echo "num:$num"
IFS=$oldIFS
echo "---------------"
lines=`cat file.txt | wc -l`
for ((i=1;i<=lines;i++));do
        echo `head -$i file.txt | tail -1`
        ((line++))
done
echo "line:$line"
echo "---------------"
num=0
while  read line ;do
        echo $line
        ((num++ ))
done < file.txt
echo "num:$num"
echo "-----------------"
num=0
cat file.txt | while  read line;do
        echo $line
        ((num++))
done
echo "num:$num"


#### while ####

[test06@node01 sh]$ while ls /;do echo ok;break;done
abc boot etc lib lost+found mnt proc sbin share sys usr
bin dev home lib64 media opt root selinux srv tmp var
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ while [ $a -le 5 ];do echo $a;((a++));done
1
2
3
4
5


#### for ####

```shell
[test06@node01 sh]$ for ((ab=1;ab<5;ab++));do echo ab=$ab;done
ab=1
ab=2
ab=3
ab=4
[test06@node01 sh]$ for i in 1 2 3 4 5;do echo $i;done
1
2
3
4
5
# 用戶給定路徑
# 輸出文件大小最大的文件
# 遞歸子目錄
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
for i in `du -a $1 | sort -nr`;do
        filename=`echo $i | awk '{print $2}'`
        if [ -f $filename ];then
                echo $filename
                break;
        fi
done
IFS=$oldIFS

注意: 變量的賦值等於號前面兩邊不能有空格,bash 對空格敏感

循環遍歷文件輸出

#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
        echo $i
        ((num++));
done
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
        echo $i
        ((num++));
done
echo "num:$num"
IFS=$oldIFS
echo "---------------"
lines=`cat file.txt | wc -l`
for ((i=1;i<=lines;i++));do
        echo `head -$i file.txt | tail -1`
        ((line++))
done
echo "line:$line"
echo "---------------"
num=0
while  read line ;do
        echo $line
        ((num++ ))
done < file.txt
echo "num:$num"
echo "-----------------"
num=0
cat file.txt | while  read line;do
        echo $line
        ((num++))
done
echo "num:$num"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章