大資料學習之Linux基礎

時間靜止不是簡史發表於2019-10-15

大資料學習之Linux基礎

自定義Linux虛擬機器安裝

點選新建虛擬機器
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
如果c盤有ssd,建議將虛擬機器安裝在c盤, 因為這樣安裝以後開啟虛擬機器更快.
同時, 建議新建一個目錄, 來存放虛擬機器
在這裡插入圖片描述

在這裡插入圖片描述

這裡建議虛擬機器的記憶體至少為 1024 MB
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
這裡建議在100GB以上, 因為要跑大資料 .
但是我們需要明白的是在這裡填100GB本地磁碟不會馬上為虛擬機器磁碟分配那麼大的記憶體空間,
而是規定了虛擬機器磁碟能使用c盤的最大容量, 以備不時之需

在這裡插入圖片描述

虛擬機器磁碟檔案存放目錄
在這裡插入圖片描述

在這裡插入圖片描述

指定光碟映像檔案, 已分享至百度雲

連結:https://pan.baidu.com/s/1AVY_tOEbL-TYGJ7cpQ0eIw
提取碼:md77
複製這段內容後開啟百度網盤手機App,操作更方便哦
在這裡插入圖片描述
注意:
Linux 版本根據自己的Linux 版本選擇。列如:我這用的是 CentOS-6.5-x86_64-minimal.iso,
所以選擇 Linux 版本時選擇時 Centos 64位
新增 ISO 映象檔案,之後開啟虛擬機器即可

等待初始化頁面載入完成
在這裡插入圖片描述
虛擬機器安裝配置(若特殊說明,則選擇繼續/OK/Next即可)
跳過磁碟檢查,否則磁碟檢查時間會很長(通過鍵盤的左右鍵+回車確定)

在這裡插入圖片描述
語言建議選擇英文
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
時區選擇, 建議選擇 亞洲/上海,在這裡選擇了時區虛擬機器中的時間就會和我們現在的時間同步
會為我們以後帶來極大的便利,相信我這個過來人!!!
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

進行磁碟分割槽, 這裡要進行三個分割槽

在這裡插入圖片描述

建立第一個分割槽

在這裡插入圖片描述
建立第二個分割槽

在這裡插入圖片描述

建立第三個分割槽

在這裡插入圖片描述

三個分割槽配置好以後,效果如下,點選next
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
檔案下載完畢後繼續Next

在這裡插入圖片描述
重啟, 然後輸入使用者名稱密碼, 輸入ls後出現下面三個檔案代表安裝成功

在這裡插入圖片描述

網路配置

1.node1網路配置

.配置靜態IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
編輯內容

# ifcfg-eth0 網路卡配置,使用開啟後編輯,
# ONBOOT=on 開機自啟 
# BOOTPROTO=static 表示 IP 使用靜態IP
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.179.140  #這裡需要根據自己的網段填寫
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
DNS1=144.144.144.144
DNS2=8.8.8.8

檢視網段 由下圖可以看出我的網段為 192.168.179.0
因此可以在 192.168.179.3-192.168.179.254 之間進行配置
在這裡插入圖片描述
刪除mac地址對映檔案

cd /etc/udev/rules.d
rm 70-persistent-net.rules -f

在這裡插入圖片描述
檢視自己的ip配置是否正常

ifconfig

在這裡插入圖片描述

最後ping一下百度

在這裡插入圖片描述

2.通過快照克隆虛擬機器

關閉虛擬機器poweroff,建立快照
在這裡插入圖片描述

通過快照克隆虛擬機器
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
這樣以次再建立兩個,一共四個
克隆後的檔案完全一樣, 也就是說登陸賬號和密碼也同我們第一個虛擬機器一樣

3.配置其他三個節點虛擬機器

1.修改每臺虛擬機器的ip(ip地址依次+1),
2.刪除mac對映檔案(.rules檔案 ,如圖1),
3.修改主機名( vi /etc/sysconfig/network ) ,重啟令其生效即可(圖2)
注意 : 阿里雲伺服器修改主機名 hostnamectl set-hostname 主機名 ,然後重啟即可

圖1
在這裡插入圖片描述
圖2: 修改主機名(依次為node2,node3,node4)
在這裡插入圖片描述

Linux簡單命令

shell命令執行原理圖

在這裡插入圖片描述

1.關機與重啟

名稱 命令
關機 poweroff / init 0
重啟 reboot / init 6

2.判斷命令的命令

type 具體命令:命令型別(外部命令 & 內部命令)
help:內部命令幫助 help:內部命令清單,附帶語法格式,描述
help 具體內部命令 具體命令的介紹
man 具體命令 :幫助手冊manual,比help更加強大( yum install man man-pages -y )
whereis 具體命令 : 定位命令位置
file 具體檔案:檢視檔案詳細資訊 (ELF 表示二進位制檔案)
echo:列印到標準輸出; $PATH: 環境變數:路徑,$LANG 語言

在這裡插入圖片描述

3.常用功能命令

ls 顯示目錄內容 ll --i
pwd 顯示當前目錄的絕對路徑
cd 切換目錄
mkdir 資料夾 -p {}
cp 複製 -r
mv 移動
touch 建立資料夾、檔案
type 命令名 檢視指定命令的檔案的存放位置 外部命令 & 內部命令
cat 檢視檔案內容
ps -fe 程式列表( 分析ps命令type ps man ps)
echo $$ 當前shell的PID

4.檔案系統命令

df -h :檢視磁碟分割槽
mount/unmout 掛載/解除安裝磁碟檔案

在這裡插入圖片描述

在這裡插入圖片描述

檔案系統層次化標準(File System Hierarchy Standard)

位於linux根目錄下, 可以直接訪問 eg: cd /root,cd /var

檔名 作用
/boot 系統啟動相關的檔案,如核心、initrd,以及grub(bootloader)
/dev 裝置檔案
/etc 配置檔案
/home 使用者的家目錄,每一個使用者的家目錄通常預設為/home/USERNAME
/root 管理員的家目錄
/lib 庫檔案
/media 掛載點目錄,移動裝置
/mnt 掛載點目錄,額外的臨時檔案系統
/opt 可選目錄,第三方程式的安裝目錄
/proc 偽檔案系統,核心對映檔案
/tmp 臨時檔案
/var 可變化的檔案
/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:存放服務啟動後需要提取的資料**(不用伺服器就是空)**

5.文字操作命令

基本命令

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

通過管道顯示profile檔案第6行的數( 可以在將來用於資料的讀取 )

在這裡插入圖片描述

vi全屏文字編輯器

開啟對 vim的支援

yum install  -y vim

全屏編輯器模式

編輯模式:按鍵具有編輯文字功能:預設開啟進入編輯模式
輸入模式:按鍵本身意義
末行模式:接受使用者命令輸入

1.開啟檔案

vim /path/to/somefile

vim +# :開啟檔案,並定位於第#行
vim +:開啟檔案,定位至最後一行
vim +/PATTERN : 開啟檔案,定位至第一次被PATTERN匹配到的行的行首

2.關閉檔案

末行模式
:q 退出 沒有動過檔案
:wq 儲存並退出 動過了,不後悔
:q! 不儲存並退出 動過了,後悔了
:w 儲存
:w! 強行儲存
:wq <==> :x

3.編輯模式

移動游標

字元
h: 左;j: 下;k: 上;l: 右

單詞
w: 移至下一個單詞的詞首
e: 跳至當前或下一個單詞的詞尾
b: 跳至當前或前一個單詞的詞首

行內
0: 絕對行首
^: 行首的第一個非空白字元
$: 絕對行尾

行間
G:文章末尾
3G:第3行
gg:文章開頭

翻屏
ctrl f (front上一頁)
ctrl b (backend 下一頁)

刪除&替換單個字元
x:刪除游標位置字元
3x:刪除游標開始3個字元
r:替換游標位置字元
刪除命令 :
d3 刪除3行資料
dw 刪除一個單詞(delete word)
dd 刪除一行

複製貼上&剪下( p相當於貼上鍵的作用 )
yw +p 複製一個單詞
yy +p 複製一行資料

撤銷&重做
u 撤銷
ctrl+r 重做 撤銷的操作
. 重複上一步的操作

4.末行模式

set:設定
set nu 顯示行號
set nonu 隱藏行號
set readonly 設為只讀

查詢
:/after 查詢和after相同的單詞+n,N 跳到下一個

s查詢並替換

# 語法
s/str1/str2/gi

#替換查詢從當前游標處,到檔案末尾處
eg: .,$s/str1/str2/gi

/:臨近s命令的第一個字元為邊界字元:/,@,#
g:當前行內全部替換(若沒有選擇,則替換當前行的第一個替換)
i:忽略大小寫
範圍
n:行號
.:當前游標行
+n:偏移n行
$:末尾行,$-3
%:全文

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

正規表示式

基本語法

	grep:	顯示匹配行
	v:		反顯示
	e:		使用擴充套件正規表示式(如果不不開啟, 需要在 "(",")"等操作符前加反斜槓
	
	匹配操作符
	\                  		轉義字元
	. 	                 	匹配任意單個字元
	[1249a][^12],[a-k]  	字元序列單字元佔位
	^                 		行首(在中括號外),在[^] 表示取反 eg: [^0-9] 第一個字元不為數字
	$                  		行尾
	\<,\>:\<abc           	單詞首尾邊界
	|                  		連線操作符
	(,)              		選擇操作符
	\n    	     			反向引用
	
	重複操作符:
	?      	匹配0到1次
	*      	匹配0到多次
	+     	匹配1到多次
	{n}   	匹配n次
	{n,}  	匹配n到多次
	{n,m}   匹配n到m次
	
	與擴充套件正規表示式的區別:grep basic
	\?, \+, \{, \|, \(, and \)
	匹配任意字元
	.*

舉例1

#在未擴充套件正規表示式時,若匹配規則中含有 ?,+,{,},|,(,) ,都需要通過 \ 轉義,否則匹配不到
#查詢a.txt中包括4位整數的行,
grep "\(^[0-9]\|[^0-9][0-9]\)[0-9]\{2\}\([0-9][^0-9]\|[0-9]$\)" a.txt

#查詢檔案a.txt中含有單詞you的內容
grep "\<you\>" a.txt

舉例2

#建立並編輯test檔案
vim test

#檔案內容
• aaabbcaaa
• aa bbc aaa
• bb bbc bbb
• asgodssgoodsssagodssgood
• asgodssgoodsssagoodssgod
• sdlkjflskdjf3slkdjfdksl
• slkdjf2lskdjfkldsjl
#查詢含有a的行
grep "a" test

#a出現3次a的行
grep "a\{3\}" test

#以aaa開頭的行
grep "\<aaa" test

#出現aaa這個單詞行,而如果aaa代表單詞,則它的前後需要有空格,即 空格aaa空格 
grep "\<aaa\>" test

#出現b的行
grep "b" test

#出現b為2-3次的行
grep "b\{2,3\}" test

文字處理命令

cut命令(文字切分)

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

顯示被空格空格分隔後的列數為1-3的行資料
在這裡插入圖片描述
在這裡插入圖片描述

顯示含有空格分隔符,1-3列的行資料,對上面命令的優化
在這裡插入圖片描述

通過冒號分隔, 獲取分割後第一列的行資料
在這裡插入圖片描述

按照每一行的首字母排序
在這裡插入圖片描述

sort命令(文字排序)

sort:排序檔案的行
	n:按數值排序
	r:倒序
	t:自定義分隔符
	k:選擇排序列
	u:合併相同行
	f:忽略大小寫

按空格分隔符分隔後第二列資料進行排序
(即對後面的數字進行排序,但是不是比較數值大小,只是單純的比較第一個數字大小,相同然後進行下一位比較…依次類推)

在這裡插入圖片描述
按空格分隔符分隔後第二列資料進行排序( 對數值排序, 對上一步的優化)
在這裡插入圖片描述
按空格分隔符分隔後第二列資料進行排序( 對數值進行倒序排序 )
在這裡插入圖片描述

wc命令: 統計數目

word count:包括行數, 單詞數, 以及位元組數(包括空格符)

在這裡插入圖片描述

學習命令技巧:通過 man 具體命令 查詢該命令如何使用

eg: man wc

在這裡插入圖片描述

通過管道去除檔名資訊
在這裡插入圖片描述

行編輯器

sed 命令

# 檢視用法
man sed

在這裡插入圖片描述

中文解釋(可以開啟man命令的中文解釋)

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/

複製第二行資料
在這裡插入圖片描述
複製第二行資料, 只顯示覆制的內容, 不再預設顯示模式空間中的內容
在這裡插入圖片描述

刪除第三行資料, 需要注意的是現在只是顯示執行後的預覽
1.如果想要這個命令生效 ,需要新增 -i (相當於資料庫中的commit)
2. "3d"相當於 3line delete
3. 在開發時, 需要我們靈活使用. 不要首先使用 -i ( 操作提交 ) ,而是先預覽無誤後提交

在這裡插入圖片描述

預覽在第2行 後 新增新行
a: after
在這裡插入圖片描述

執行在第2行 前 插入一行字元sxt
-i : 執行命令
i\string : 指定行前
在這裡插入圖片描述
預覽行編輯將字串 “sxt” 替換成 "hello"

在這裡插入圖片描述

通過正則式匹配 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
#提交
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}
支援自定義分隔符(-F"自定義分隔符")
支援正規表示式匹配
支援自定義變數,陣列  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

呼叫 print函式輸出分割符分割後的第一列的資料
F 指定分割符

只是顯示/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

在這裡插入圖片描述
相當於如下cut命令
在這裡插入圖片描述

統計報表:合計每人1月工資,0:manager,1:worker

man awk

/file #查詢到下一行,可以看到awk不僅支援命令,而且支援指令碼檔案

q  #退出介紹

在這裡插入圖片描述
思路:先編寫指令碼,通過指令碼執行該報表檔案

# 報表內容
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

編寫指令碼

呼叫split分割第3列資料並且分割依據"-"進行分割
如果月份等於01
將第一列(姓名)作為陣列下標
name[$1]+=$5 將相同陣列下標元祖的值進行求和
END方法中遍歷name陣列,然後輸出結果

{
split($3,date,"-");
if(date[2]=="01"){
name[$1]+=$5
}
}
END{
for(i in name){
print i "\t" name[i]
}
}

通過指令碼文查詢報表檔案

# -f 指令碼檔名
awk -f awk.sh awk.txt 

在這裡插入圖片描述

使用者與許可權

基本用法

id				列印輸出有效使用者的自身的ID 和 所在組的 ID
useradd			新增使用者
userdel			刪除使用者
groupadd		新增組
groupdel		刪除組
passwd			設定或修改密碼
sudo 			提升許可權
su				切換使用者

ReadMe:

  1. 新增使用者後,會自動為該使用者新增郵箱檔案,
    如果刪除檔案,不僅需要存在 /home 下刪除使用者,還要去 /var/spool/mail/ 中刪除同名的郵箱檔案
  2. 修改密碼, root使用者 passwd修改root使用者密碼; passwd 使用者名稱修改指定使用者密碼; 普通使用者passwd 只能修改自己密碼
  3. 建立角色和密碼後, 可以在xshell中通過ssh 使用者名稱@使用者所在ip進行登入.
    而且,這些建立的普通使用者只能進行簡單的檔案檢視功能.這裡就引入了使用者組的操作,通過使用者組完成許可權的分配

使用者組操作

新增使用者組, 檢視各使用者id

groupadd 新建使用者組名

在這裡插入圖片描述

將兩個普通使用者新增到使用者組 share中, 並再次檢視使用者id ,確認是否分配成功

usermod -G 使用者組名

在這裡插入圖片描述

更改許可權 ,為檔案賦予指定組

#chown 檔案所屬原使用者組:現使用者組 檔名 
chown root:share share/

# 給指定檔案新增 使用者組的讀許可權 
# 第一組 rwx 代表檔案所有者許可權,第二組 r-x 代表使用者組許可權,第三組 r-x 代表其他使用者許可權。
# 許可權分類: r:讀許可權 w:寫許可權 x:執行許可權(開啟資料夾也需要讀許可權)
# 角色 a:所有角色 u:所屬使用者 g:使用者組 o:其他
chmod g+r share/
# 或者更改檔案的所有者
chown -R chy share/

# 撤回其他使用者讀寫執行許可權
# 注意這裡修改許可權後需要重新登陸使用者組的使用者才能生效
chmod o-r--w-x share/

linux角色許可權必會知識

1. 下圖各列引數作用:
檔案許可權 連線數 檔案所有者 使用者組 檔案大小 修改日期 檔名
2 .第一列引數意義:
第一組 rwx 代表檔案所有者許可權,第二組 r-x 代表使用者組許可權,第三組 r-x 代表其他使用者許可權。
3. 許可權分類:
r:讀許可權 w:寫許可權 x:執行許可權(開啟資料夾也需要讀許可權)
4. 角色分類
a:所有角色 u:檔案所有者 g:使用者組 o:其他

瞭解更多相關知識請前往
在這裡插入圖片描述

許可權操作

命令 作用
r 讀許可權 r=4
w 寫許可權 w=2
x 可執行許可權 x=1
usermod 修改使用者許可權
chown 修改檔案的屬主和屬組
chmod 修改檔案操作許可權 (RWX) augo

注意
許可權有兩種表示方式, 一種字母方式 : r:讀許可權 w:寫許可權 x:執行許可權(開啟資料夾也需要讀許可權)
還有一種是數字方式: r4w2x1 ,我們可以通過數字的形式同時為檔案所有者_使用者組_其他使用者賦予許可權
但是所做的所有修改對於root 使用者來說是形同虛設的( root牛皮!!!)

例如:

# 賦予所有使用者讀許可權
chmod 444 filename/ chmod a+x filename
#賦予所有使用者所有許可權
chmod 777 filename/ chmod a+wrx filename

Linux軟體安裝

編譯安裝

主要體會./confiure , make ,make install 的區別

# 1. 檢查作業系統 ,檢查編譯環境
yum install gcc
# pcre 依賴庫
yum search pcre
yum install pcre-devel
# openssl
yum install opssl-devel  


# 2.上傳並解壓
  tar -zxf  nginx-1.8.0.tar.gz

# 3.在解壓目錄下生成編譯依賴關係
./configure 
 
# 4.編譯安裝
make  & make install

#5. 進入nginx的命令管理目錄,啟動
cd /user/sxt/nginx/sbin     
./nginx

# 7.瀏覽器訪問測試
輸入虛擬機器地址即可 

rpm安裝

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

# rpm安裝:
-ivh  filename
--prefix
# rpm升級:
-Uvh
-Fvh
rpm解除安裝:
-e PACKAGE_NAME

# rpm查詢 ,配合管道一起使用 ,例如 rpn -qa |grep jdk
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包安裝生成的(與type(檢視命令所在目錄)命令一起使用)	
rpm -qf /path/to/somefile

# 如果某rpm包尚未安裝,需查詢其說明資訊、安裝以後會生成的檔案
rpm -qpi /PATH/TO/PACKAGE_FILE
rpm -qpl 

小技巧 : 見到別人的命令很好用,自己如何安裝

例如 ifconfig命令

1.檢視該命令所在資料夾 type ifconfig
ifconfig is /sbin/ifconfig

2.查詢該目錄下的 jar包 rpm -qf /sbin/ifconfig
net-tools-1.60-110.el6_2.x86_64

3.搜尋 yum search net-tools 不要加版本
================================ N/S Matched: net-tools =================================
net-tools.x86_64 : Basic networking tools

4.安裝 yum install net-tools
5.使用

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

阿里雲CentOS的yum源

# 1.進入映象倉庫
cd /etc/yum.repos.d/
 
# 2.建立用於備份的資料夾(更換源失敗可以從備份檔案獲取)
mkdir backup

# 3.將映象檔案移動到備份檔案中
mv CentOS-* backup/

# 4.下載wget命令支援包
yum install -y wget

# 5. 下載阿里映象,下載以後 yum.repos.d檔案下回多出一個檔案CentOS-Base.repo(圖1)
# 阿里雲映象站地址 https://opsx.alibaba.com/mirror
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
# 我們可以檢視這個檔案 ,這個檔案中存放了許多安裝地址
cat CentOS-Base.repo

# 6.清除本地快取的jar包依賴關係(圖2)
yum clean all

# 7.重新新增阿里的依賴關係快取(圖3)
yum makecache

如果安裝出現如下錯誤http://mirrors.aliyuncs.com/centos/6/updates/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 56 - "Failure when receiving data from the peer"
需要根據repo檔案變數的變化,可以修改repo檔案把所有$releasever替換成6 
# 執行替換操作
sed -i 's/\$releasever/6/' CentOS-Base.repo

# 清理並重新生成yum快取
yum clean all

# 重新yum makecache, 出現圖4說明安裝成功
yum makecache

#如果還出現錯誤 ,執行如下sed語句 ,清空快取 ,並重新生成快取
sed -i '/mirrorlist/d' CentOS-Base.repo
sed -i 's/\$releasever/6/' CentOS-Base.repo
sed -i  '/\ [addons\]/,/^$/d' CentOS-Base.repo
sed -i 's/RPM-GPG-KEY-CentOS-5/RPM-GPG-KEY-CentOS-6/' CentOS-Base.repo

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述

本地 yum 源

1.為當前虛擬機器掛載映象檔案

在這裡插入圖片描述

# 2.掛載 cdrom (mount 被掛載檔案 掛載檔案)
mount /dev/cdrom /mnt

# 3.備份CentOS-Base.repo檔案
cd /etc/yum.repos.d/
cp CentOS-Base.repo CentOS-Base.repo.backupAliYuan

# 4.修改CentOS-Base.repo,檔案只保留下面內容(圖1)
#[base]
name=local
failovermethod=priority
baseurl=file:///mnt
#gpgchkeck= 有1和0兩個選擇,分別代表是否是否進行gpg校驗,如果沒有這一項,預設是檢查的。 
gpgcheck=1
#當某個軟體倉庫被配置成 enabled=0 時,yum 在安裝或升級軟體包時不會將該倉庫做為軟體包提供源。使用這個選項,可以啟用或禁用軟體倉庫。  
enable=1

# 5. 重新安裝依賴快取(圖2)
yum makecache

# 6. 安裝想使用的軟體,例如 mysql(無需聯網)
yum install mysql-server

重啟後, 在使用本地源時,建議檢視映象檔案是否被掛載(圖3)
df -h

如果沒有被掛載 ,重新掛載一下( 取消掛載命令是umount )
mount /dev/cdrom /mnt

# 如果下載不上,建議首先檢視掛載設定連線狀態圖4 ,然後重新掛載一下,如果實在沒有就更換為阿里資料來源
步驟: 
取消本地掛載, 
刪除本地CentOS-Base.repo ,
放開/重新下載阿里的CentOS-Base.repo,
清除並重新下載依賴關係

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述
圖4
在這裡插入圖片描述

中文顯示,檢視幫助中文文件

中文顯示

# yum 的 repo 變成aliyun  || 本地DVD

# 1. 如果使用本地源, 檢視列表是否含有中文包
yum grouplist | grep Chinese Support

# 2.如果存在直接下載(使用阿里源的直接執行這一步)
# 注意: 存在空格的必須使用 " "引上
yum groupinstall "Chinese Support"

#3 .查詢當前語言, 如果顯示的是en_US.UTF-8
echo $LANG

# 4. 更換語言為中文,可以通過ll檢視是否配置成功(下圖)
LANG=zh_CN.UTF-8

在這裡插入圖片描述

中文幫助文件設定

前提 :執行上面的中文顯示的支援

# 1. 訪問阿里映象站, 下載epel源 ,網站地址 https://opsx.alibaba.com/mirror?lang=zh-CN
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

# 2. 下載中文支援下的依賴
yum repolist

# 3. 依次執行如下命令
yum clean all
yum makecache
yum search man-pages
yum install man man-pages man-pages-zh-CN

# 4. 測試幫助命令是否變為中文(如下圖)
man bash 

# 5. 注意 :每次重啟後 ,如果中文顯示不出來了, 需要執行如下命令 ,
# 因為LANG命令是對每一個bash而言的(一個視窗對應一個bash)
LANG=zh_CN.UTF-8

在這裡插入圖片描述
注意 : 即使安裝了中文包, 也不是每個命令都會被翻譯成中文

文字流和重定向

# 檔案描述符fd
cd /proc/$$/fd  +tab鍵 ( $$就會轉換成程式當前shell的id)

# 檢視檔案描述符fd目錄(圖1)
ll
0 標準輸入
1 標準輸出
2 錯誤輸出

# 利用管道與程式id檢視當前程式新訊息, 再由當前程式尋找他的父程式(圖2)
# 也就是說我們每次發起請求, 都會在服務端開啟一個虛擬終端
ps -ef | grep 6564
ps -ef | grep 6560

# 我們可以進入父程式所在目錄檢視虛擬終端(圖3)
# 如果建立一個視窗執行第一個操作 ,虛擬終端id就會從0加1, 一次類推
# 在Linux中. 一切皆檔案!!!
# 所有命令, 功能都可以對映成檔案 ,都有012這種輸入輸出方式
cd dev pts




圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述

重定向

輸出重定向

#輸入重定向
# 見圖1
1>xxx	標準輸出覆蓋重定向
1>>xxx	標準輸出追加重定向

# 見圖2
2>xxx	錯誤覆蓋重定向
2>>xxx	錯誤追加重定向


# 在一個檔案中如果同時輸出標準輸出內容和錯誤內容
# 1.使用普通重定向 ,會發現不會出現錯誤音效(圖3) ,原因是在執行ls時, 首先會掃描檔案是否存在 ,然後輸出檔案資訊將原來的錯誤資訊
# 2.因此, 如果使用追加重定向時 ,無論順序如何 ,都會首先列印錯誤資訊(圖4)

# 3. 檔案描述符+">&"+重定向符號詳細形式
# 注意: 左邊檔案描述符(1,2)與重定向符號之間是不能有空格的 ,但是右邊可以, 所以建議都不要留空格
ls / /error  2>&1 1>&eee
ls / /error 1>&fff 2>&1

# 4.特例(簡寫形式) :>&或者&> xxx	向 xxx 檔案新增錯誤和標準輸出資訊(圖5)
ls / /error >& ggg
ls / /error &> hhh

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述

圖3
在這裡插入圖片描述
圖4
在這裡插入圖片描述
圖5
在這裡插入圖片描述

圖6
在這裡插入圖片描述
輸入重定向

# 輸出重定向
#語法
<<<	從字串中讀取輸入
<<E	從鍵盤中讀取輸入,E表示結束符
<	從檔案中讀取輸入

[root@node01 input]# read aaa <<<"HelloWord"
[root@node01 input]# echo $aaa
HelloWord
[root@node01 input]# read aaa<<GG
> ljasf
> ajlsdfj;la
> ;ajdfkl
> GG  #跟 GG 一樣,表示輸入退出

# 輸出aaa第一行資料
[root@node01 input]# echo $aaa
ljasf

# input.sh 指令碼
cat <<AABB
print error info
AABB
echo "you know me .."

# 執行
source input.sh

[root@node01 input]# cat 0< /etc/in
init/    init.d/  inittab  inputrc  
[root@node01 input]# cat 0< /etc/inittab 

全重定向

# 全重定向:socket案例
# 建立檔案描述符8
exec 8<> /dev/tcp/www.baidu.com/80

# 傳送請求, 將資訊寫入8中
echo -e "GET / HTTP/1.0\n" >& 8

# 輸出8的資訊(圖下圖)
cat <& 8

在這裡插入圖片描述

shell 指令碼程式設計

Bash

linux的釋出版本之一——Redhat/CentOS——系統預設安裝的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增強版本。Bourn Shell 是最早行起來的一個shell,創始人叫Steven Bourne,為了紀念他所以叫做Bourn Shell,檢稱sh。

含有shell命令的檔案三種執行方式

第一種 source 檔名(圖2)
第二種 . 檔名 (圖3)
第三種 賦予該檔案執行許可權 chmod -R 777 檔名 , 執行該檔案 ./檔名 (圖4)

注意:
一定要寫成 ./test.sh,而不是 test.sh,執行其它二進位制的程式也一樣,
直接寫 test.sh,linux 系統會去 PATH 裡尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裡,
你的當前目錄通常不在 PATH 裡,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
想要具體瞭解shell程式設計可通過這裡進行學習

圖1 :含有指令碼的檔案 sh01
在這裡插入圖片描述
圖2
在這裡插入圖片描述

圖3
在這裡插入圖片描述
圖4
在這裡插入圖片描述

變數

# 語法
# 本地:(圖1)
	當前shell擁有
	生命週期隨shell
# 區域性:
	只能local用於函式
# 位置:(圖2)
	$1,$2,${11} 從指令碼檔案後,讀取引數
# 特殊
	$#: 位置引數個數(圖3,圖4,圖5)
	$*: 引數列表,雙引號引用為一個字串
	$@: 引數列表,雙引號引用為單獨的字串
	
	$$:當前 shell 的 PID:接收者(圖6)
	$BASHPID:真實
	管道 *
	$?:上一個命令退出狀態
	- 0 成功
	-other: 失敗
	
# 變數
	export 定義環境變數: 不管開啟了多個字bash,都會引用系統變數
	匯出到子 shell
	fork() Copy On Write 時間複雜度 O(1)
	適用用於函式
	unset: 取消變數
	set: 檢視shell 的變數

圖1
在這裡插入圖片描述

# 建立shell檔案
vim test.sh
# 編輯內容
echo $1
echo $2
# 發現a,b自動被shell檔案接收並輸出(圖2)
source test.sh a b

圖2
在這裡插入圖片描述

圖3
在這裡插入圖片描述
在這裡插入圖片描述

圖4
在管道里建立子bash時 , 它會繼承父bash
在這裡插入圖片描述
圖5
但是在檔案中執行子bash時, 他不會繼承父bash的值, 只有export ,他才會繼承他的值
而且 ,不能跨bash
在這裡插入圖片描述
在這裡插入圖片描述
圖6
在這裡插入圖片描述

引用

雙引號:弱引用,引數擴充套件
單引號:強引用,不可巢狀
花括號擴充套件不能被引用
命令執行前刪除引用

[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

表示式

# 算術表示式(圖1,圖2)
let  算術運算表示式
let  C=$A+$B
$[算術表示式]
C =$[$A+$B]
$((算術表示式))
C=$(($A+$B))
expr  算術表示式  
注意:表示式中各運算元及運算子之間要有空格。而且要使用命令引用
C=`expr $A + $B`
help let

# 條件表示式(圖3)
[  expression  ]
test expression
[[ expression ]]
help test

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3

在這裡插入圖片描述

編寫shell 指令碼案例——新增使用者指令碼

明確需求

新增使用者
使用者密碼同使用者名稱
靜默執行指令碼
避免捕獲使用者介面
程式自定義輸出

指令碼內容

第二行判斷引數,
第三行判斷使用者是否存在,
第四行新增使用者密碼並解決資料回顯,
第五行解決許可權不足問題

#! /bin/bash
[ ! $# -eq 1 ] && echo "args error!" && exit 2
id $1 >& /dev/null && echo "user exist!" && exit 3
useradd $1 >& /dev/null $$  echo $1 | passwd --stdin $1 >& /dev/null && echo "add user successful!!!" && exit 4
echo "user add fail for no why" && exit 5

總結 :
指令碼使用的意義就是實現專案啟動自動化 ,在大型分散式專案部署的時候 ,可能有幾十甚至上百個服務需要啟動 ,
這個時候, 指令碼自動化實現就顯得尤為重要了

邏輯判斷

# 判斷命令是否被執行? 返回值為0代表執行 ,非0代表執行失敗
# 在Linux中的條件判斷中 ,返回0代表是true ,非0代表false ,區別java
echo $? 

# 邏輯判斷
command1 && command2
command1 || command2

流程控制

if選擇語句

man if
NAME
       if - 有條件的執行指令碼

總覽 SYNOPSIS
       if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
________________________________________________________________________________

描述 DESCRIPTION
       if  命令把 expr1  作為一個表示式來求值(用與 expr 求值它的引數相同的方 式)
       。 這個表示式的值必須式一個 boolean  值(一個數值值,這裡 0 是假而任何其他
       數值都是真;或者是一個字串值,比如 trueyes  是真而 false 或 no   是
       假) ;如果它是真通過把 body1  傳遞給 Tcl 直譯器來執行它。否則把 expr2  作
       為一個表示式來求值並且如果它是真則執行 body2,以此類推。如果沒有表示式 被
       求值為真則執行 bodyN 。then 和 else  是可選的“噪音詞”用來使命令易讀。可
       以有任意數目的 elseif  子句,包括零個。BodyN  與 else   可同時省略。命 令
       的 返 回 值是被執行的那個指令碼的返回值,如果沒有表示式是非零並且沒有 bodyN
       則返回空串。

參見 SEE ALSO
       expr(n), for(n), foreach(n)

關鍵字 KEYWORDS
       boolean, conditional, else, false, if, true

在這裡插入圖片描述

while迴圈語句

man while
NAME
       while - 在條件滿足時重複的執行指令碼

總覽
       while test body

描述
       while   命令把 test 作為一個表示式來求值(用與 expr 求它的引數的值相同的方
       式)。這個表示式的值必須是一個正確的 boolean 值;如果它是真值則把 body  傳
       遞給 Tcl 直譯器來執行它。一旦執行了 body 則再次求值 test ,並重復處理直到
       最終 test 求值出一個假 boolean 值。可以在 body 中執行 Continue 命令來終止
       這 個迴圈的當前重複操作(iteration),並可以在 body 中執行 break 命令來導致
       while 命令立即終止。while 命令總是返回一個空串。

       注意: test 應該總是包圍在花括號中。如果不是,在 while 命令開始執行之前 將
       進 行變數替換,這意味著迴圈體所做的變數變更將不考慮在這個表示式中。這將很
       可能導致無限迴圈。如果 test 被包圍在花括號中,變數替換被推遲到求值這個 表
       達 式的時候(在每次迴圈重複操作之前),所以變數的變化將是可見的。例如,嘗試
       下列指令碼並在 $x<10 兩邊分別加上和不加花括號:

       set x 0
       while {$x<10} {
            puts "x is $x"
            incr x
       }

在這裡插入圖片描述

for迴圈語句

man for
________________________________________________________________________________

NAME
       for - ‘‘For’’ 迴圈

總覽 SYNOPSIS
       for start test next body
________________________________________________________________________________

描述 DESCRIPTION
       For  是一個迴圈命令,在結構上類似與 C 語言的 for語句。start、next、和body
       引數必須是 Tcl 命令串,而 test 是一個表示式串。for  命令首先呼叫 Tcl 解釋
       器來執行 start。接著它重複的把 test作為一個表示式來求值;如果結果是非零則
       它在 body 上呼叫 Tcl 直譯器,接著在 next 上呼叫 Tcl 直譯器,接著重複這 個
       迴圈。在 test  被求值為 0 的時候命令終止。如果body  中呼叫了 continue  命
       令則在 body  的當前執行中的所有剩餘的命令都被跳過;處理繼續,在 next 上調
       用  Tcl 直譯器,接著對 test 求值。 等等. 如果在 body 或 next 中呼叫 break
       命令,則 for  命令將立即返回。break  和 continue  命令的操作類似於在 C 語
       言中相應的語句。For  返回一個空串。

       注意: test 應當總是在花括號中包圍著。如果不是這樣,在 for  命令開始之前就
       作了變數替換,這意味著在迴圈體中做的變數變更在表示式中將不被考慮。將導 致
       一 個 無限迴圈。如果 test  被包圍在花括號中,變數替換將延遲,直到表示式求
       值(在每次迴圈重複之前),所以變數的變更將是可見的。例如,嘗試在 $x<10 周圍
       有和沒有一對花括號的下列指令碼:

在這裡插入圖片描述

反引號就是esc下面的那個按鍵!!!
在這裡插入圖片描述

編寫shell 指令碼案例——判斷目錄下最大檔案

思路

使用者給定路徑
輸出檔案大小最大的檔案
遞迴子目錄

指令碼內容

#! /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

執行測試
在這裡插入圖片描述

編寫shell 指令碼案例——遞迴子目錄

被遍歷的檔案file.txt

aaa 111
bbb 222
ccc 333
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
echo "--------加強for迴圈---------"
num=0;
        for i in `cat file.txt`;
        do echo $i;
        ((num++))
done
echo "line:$num"
IFS=$oldIFS

echo "--------普通for迴圈----------"
line=0;
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 "--------while迴圈-------------"
num=0
while read line;
do echo $line
((num++))
done <file.txt
echo "line:$num"

echo "---------使用管道的兩個命令都位於子bash,其他位於父bash----------"
num=0
cat file.txt | while read line;
do echo $line
((num++))
done
echo "num:$num"

執行測試
在這裡插入圖片描述

連結:https://pan.baidu.com/s/115USM9-LIX_EZkm5ZAXvEw&shfl=sharepset 提取碼:2ti6

相關文章