大資料學習之Linux基礎
大資料學習之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:
- 新增使用者後,會自動為該使用者新增郵箱檔案,
如果刪除檔案,不僅需要存在/home
下刪除使用者,還要去/var/spool/mail/
中刪除同名的郵箱檔案 - 修改密碼, root使用者
passwd
修改root使用者密碼;passwd 使用者名稱
修改指定使用者密碼; 普通使用者passwd
只能修改自己密碼 - 建立角色和密碼後, 可以在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 是假而任何其他
數值都是真;或者是一個字串值,比如 true 或 yes 是真而 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"
執行測試
相關文章
- 大資料學習之路——java基礎(二)大資料Java
- 零基礎大資料學習框架大資料框架
- 大資料分析/機器學習基礎之matplotlib繪圖篇大資料機器學習繪圖
- 大資料學習方法,學大資料需要的基礎和路線大資料
- Linux 學習基礎入門之Linux分割槽Linux
- 大資料:大資料之基礎語法大資料
- 好程式設計師大資料學習路線分享大資料之基礎語法程式設計師大資料
- 資料結構基礎學習之緒論資料結構
- 大資料基礎學習-4.Zookeeper-3.4.5大資料
- 入行IT界,0基礎如何學習大資料?大資料
- 大資料學習記錄,Python基礎(3)大資料Python
- 大資料基礎學習-5.Flume1.6.0大資料
- 大資料基礎學習-6.Kafka2.11大資料Kafka
- 大資料基礎學習-7.Hive-1.1.0大資料Hive
- 大資料基礎學習-8.Hbase-1.2.0大資料
- 大資料基礎學習-9.Spark2.1.1大資料Spark
- 大資料學習記錄,Python基礎(4)大資料Python
- 學習Java大資料都需要哪些基礎Java大資料
- 學習大資料需要什麼基礎?大資料要學哪些內容?大資料
- Linux基礎學習Linux
- 學習linux基礎Linux
- 什麼是大資料?零基礎如何學習大資料?(附學習路線)大資料
- Linux 學習基礎入門之Linux發展史Linux
- 資料結構基礎學習之線性表資料結構
- 突擊學習之資料庫基礎彙總資料庫
- Linux基礎學習——檔案基礎Linux
- linux基礎命令學習Linux
- 大資料學習:零基礎大資料入門該看哪些書?大資料
- 一起來學大資料——走進Linux之門,學習大資料的重中之重大資料Linux
- 資料結構基礎學習之(棧和佇列)資料結構佇列
- 資料結構基礎學習之(串與陣列)資料結構陣列
- 零基礎大資料學習線路詳解大資料
- 零基礎學習大資料人工智慧,學習路線篇!大資料人工智慧
- opencv學習之基礎OpenCV
- Linux基礎學習-Docker學習筆記LinuxDocker筆記
- Linux學習-shell基礎02Linux
- Linux系統基礎學習Linux
- Linux基礎學習五點Linux