我的技術博客:www.zhenganwen.tophtml
NAT模式的特色是,虛擬機和宿主機組成一個獨立的虛擬網絡,而不受宿主機所在物理網絡(外網)的影響。node
如上圖所示,虛擬機會虛擬出一個交換機,這個交換機的屬性能夠在VMware->編輯->虛擬網絡編輯器中設置。通常路由器也即網關的IP的主機部分設置爲1(IP中對應子網掩碼爲1的位爲網絡部分,用來區分網段;對應子網掩碼爲0的位爲主機部分,用來區分該網段內的主機。如network爲255.255.255.0
時,其前24位位1,後8位位0,則IP192.168.25.1
的網絡部分爲192.168.25
而主機部分爲1
),這是約定俗成的。在設置好網關IP以後,咱們就能獲得網關的IP、子網掩碼了。mysql
根據子網IP192.168.25.0
以及網關的主機部分約定俗成爲1,咱們將NAT設置中的網關IP設置成192.168.25.1
linux
打開宿主機的網絡適配器,根據上圖找到NAT模式對應的網卡,這裏是VMnet8:算法
右鍵屬性配置該虛擬網卡:sql
最簡單的配置方式就是使用命令setup
:shell
上下選擇菜單項,
Tab
鍵切換到紅色按鈕或者菜單項。express
這裏爲了後續使用SSH遠程鏈接客戶端鏈接虛擬機,這裏不啓用DHCP向網關動態獲取IP,而是用靜態IP192.168.25.200
:編程
除了使用setup
命令,咱們也能夠經過修改/etc/sysconfig/network-scripts/ifcfg-eth0
來配置:bash
DEVICE=eth0
TYPE=Ethernet #以太網協議
ONBOOT=yes #是否開機啓用
BOOTPROTO=static #ip地址設置爲靜態
IPADDR=192.168.0.200
NETMASK=255.255.255.0
GATEWAY=192.168.25.1 #經過網關訪問外網
複製代碼
爲了確保配置即刻生效,service network restart
重啓網絡服務。或者因爲只更改了一張網卡的配置,能夠經過ifconfig eth0 down
、ifconfig eth0 up
重啓網卡。
在宿主機ping
虛擬機發現可以ping
通了:
C:\Users\zaw>ping 192.168.25.200
正在 Ping 192.168.25.200 具備 32 字節的數據:
來自 192.168.25.200 的回覆: 字節=32 時間<1ms TTL=64
來自 192.168.25.200 的回覆: 字節=32 時間<1ms TTL=64
來自 192.168.25.200 的回覆: 字節=32 時間<1ms TTL=64
來自 192.168.25.200 的回覆: 字節=32 時間<1ms TTL=64
複製代碼
同時在宿主機上ping
外網發現也可以ping
通,至此虛擬網絡和外網互聯了:
值得注意的是,NAT模式根本不關心宿主機的物理網卡,而只關心其虛擬網卡VMnet8
,所以當宿主機物理網卡的IP更改時(即宿主機鏈接不一樣的外網時),虛擬網絡仍然能訪問外網(即虛擬機仍能訪問外網),這也是NAT模式和橋接模式最大區別,即NAT模式可以虛擬出一個網段以隔絕虛擬網絡和外網。
橋接模式下,全部的虛擬機是橋接在宿主機上的,至關於中間使用了一個集線器,這種狀況下虛擬機IP處於宿主機和外網鏈接的網段下才能訪問外網。這必然受宿主機物理網卡的實際IP的牽制,因爲咱們開發時的我的電腦鏈接的網絡可能會更改並且使用DHCP從互聯網提供商獲取IP來上網時也會致使IP的改變。所以爲了不頻繁配置虛擬機IP,一般使用NAT方式比較方便。
這種模式下,虛擬機的眼裏只有宿主機,沒法訪問外網。
有時咱們爲了在本機上模擬集羣操做,須要從一個minimal
版的Linux克隆出多個Linux
注意克隆類型選擇建立完整克隆,克隆出來的纔是一臺獨立的主機
可是克隆出來的主機網卡eth0
和源主機衝突(每一個主機都只能有惟一的物理地址),因而VMware爲其生成了一塊新的網卡eth1
而停用了eth0
:
首先咱們須要修改/etc/sysconfig/network-scripts/ifcfg-eth0
(刪除其中的UUID,HWADDR
,配置靜態IP):
而後修改/etc/udev/rules.d/70-persistent-net.rules
:
最後reboot
使之生效:
[root@mini01 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:98:24:D9
inet addr:192.168.25.202 Bcast:192.168.25.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe98:24d9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:67 errors:0 dropped:0 overruns:0 frame:0
TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10455 (10.2 KiB) TX bytes:14432 (14.0 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1472 (1.4 KiB) TX bytes:1472 (1.4 KiB)
複製代碼
一般咱們是經過SSH客戶端來遠程操做Linux服務器的,而Linux默認就內置了SSH服務程序,咱們能夠經過netstat -nltp
來查看:
因而咱們就能夠在本地經過經常使用的SSH客戶端工具SecureCRT
進行登陸鏈接,協議選擇SSH
,端口22
,輸入用戶名和密碼點擊鏈接便可。
Linux也提供了ssh
客戶端工具,以ssh
命令的形式存在,最常使用的格式是:ssh [<user>@]<hostname>
,可是這種登陸方式每次都須要輸入密碼,而ssh
還提供了另外一種免密登陸方式,其原理以下:
machine1
要想免密登陸machine2
首先要經過ssh-keygen
經過rsa
算法生成一對非對稱加密的祕鑰對(將保存在/root/.ssh
中):
[root@hadoop01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
74:d1:f2:65:fc:d9:95:51:b9:a3:54:66:67:46:0a:ac root@hadoop01
The key's randomart image is:
+--[ RSA 2048]----+
| .o.. oB|
| ..o.+B=|
| . .+ o=+*|
| . .E .. +o|
| S . . .|
| . |
| |
| |
| |
+-----------------+
[root@hadoop01 ~]# ll .ssh/
總用量 8
-rw-------. 1 root root 1675 6月 6 09:44 id_rsa
-rw-r--r--. 1 root root 395 6月 6 09:44 id_rsa.pub
複製代碼
其中id_rsa.pub
稱爲公鑰,id_rsa
稱爲私鑰,公鑰用來加密,私鑰用來解密。公鑰用來複制到要登陸的目標主機的受信任列表authorized_keys
中,能夠藉助ssh-copy-id <hostname>
來完成:
[root@hadoop01 ~]# ssh-copy-id 192.168.25.201
The authenticity of host '192.168.25.201 (192.168.25.201)' can't be established.
RSA key fingerprint is eb:89:4f:4e:f5:9d:00:d4:14:1c:8b:8d:93:0e:3c:00.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.25.201' (RSA) to the list of known hosts.
root@192.168.25.201's password:
Now try logging into the machine, with "ssh '192.168.25.201'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
複製代碼
查看192.168.25.201
的受信任列表:
[root@mini01 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAr/2gtvBX87wo9iSW+yTwGwmVbOpMmWYrgj8Tbl9VsBv/vCd6ktOg5Gwppb9NkVa8lj3FkN0UOOe6/xI7dr3C4+5kxvoo6GIHy/9mO67Rndo1YAZZ7UlPaJb5Kb8rkDcwX/KeylPTnrclykaBM5YypZSTr+pqZpiYAmaozLnBtzQnWgX6ZK4ijcS+psSI+bAeXZmyjAdY8qQ7Ncv3Lgr/jENL34letB9c1wOnOGSf+GkcO6hL9+n8FwlC2bld91noR17W+YQvyhdXdbK+DGPSDqbsCzlQHFJsbttBlFQZk8ErOU5GlUCiFXZzWJ3ItSC0+q/+TylU1MOkM7Ejno1/fQ== root@hadoop01
複製代碼
其中的表項就是由id_rsa.pub
中的內容和遠程登陸信息root@hadoop01
組成。之後當hadoop01
機器上的root
用戶遠程登陸到192.168.25.201
時,201
發如今本身的受信任列表中包含了root@hadoop01
因而會用這個表項對應的公鑰加密一個隨機字符串發送到企圖鏈接到201
的機器上,若是該機器真的是hadoop01
而不是假裝的,那麼它就能用本身的私鑰將密文解密並返給201
,201
發現解密後的正確纔會讓其登陸。由於每一個主機的私鑰惟一,所以只要本身不泄露,其餘主機就沒法假裝成hadoop01
登陸201
。
cat
:滾屏輸出文件全部內容more
:翻頁查看文件
b
上一頁q
退出less
:翻頁查看文件,比more
更強大,除了b
、空格以外,還有
↑↓
翻行/keyword
查找,n
下一個關鍵字,N
上一個gg
跳到首行G
跳到末行tail
,查看文件尾部
tail -10
,查看文件最後十行tail -f/F
,查看文件內容,當有內容追加到文尾時實時刷新。-f
是根據文件的inode
來追中文件的,而-F
是根據文件名來追蹤文件的。若是使用log4j
,可能會遇到向xx.log
中持續輸出日誌,當xx.log
大小達到4KB的時候就將其保存爲xx.log-1
這種機制。這時要想持續跟蹤日誌動態,就要選擇-F
。head -<N>
,查看文件首部a
,光標後一位插入A
,該行行尾插入I
該行行首插入o
,從該行的下一行插入空行並開始編輯gg
,跳到文件的首行G
,跳到文件的末行yy
,複製本行,nyy
表示複製從光標往下的n行dd
,刪除本行,ndd
表示刪除從光標往下的n行p
,粘貼已複製的內容v
,進入字符選擇模式,可按y
複製,p
粘貼ctrl v
,進入塊選擇模式shift v
,批量選中行%s/abc/123
,將文件中的全部abc
替換爲123
,s是substitude
(替換)的首字母/abc
,從光標以後查找abc
,n
查找下一個,N
查找上一個u
,撤銷上一次操做shift + DoubleClick z
,按住shift
連按兩下z
,保存並退出u
g
o
增長權限:
chmod u/g/o +r/w/x
,取消權限:-r/w/x
r、w、x的權限值可表示爲四、二、1
遞歸給文件夾中的全部文件賦予權限:chmod -R
useradd <username>
passwd <username>
,爲新添加的用戶設置密碼或爲已有的用戶更改密碼上述命令只有
root
纔有權限執行
爲了不不可逆的破壞操做系統的操做發生,實際應用中一般不用root
身份登陸OS。此時若是想執行相似的受限命令,咱們須要在命令前加上sudo
:
[root@hadoop ~]# su hadoop
[hadoop@hadoop root]$ useradd tom
bash: /usr/sbin/useradd: 權限不夠
[hadoop@hadoop root]$ sudo useradd tom
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for hadoop:
hadoop 不在 sudoers 文件中。此事將被報告。
複製代碼
su [username]
,經過用戶名切換到指定用戶,若未指定用戶名則默認切換到root
上述咱們切換到普通用戶hadoop
並試圖經過sudo
再次執行受限命令,卻又被提示hadoop
用戶不在sudoers
文件中。
這是由於普通用戶要想經過sudo
片刻得到執行某些特權命令必須讓root
事先在/etc/sudoers
中添加相關的配置,如配置hadoop
能夠在任何位置執行任何命令(這是最大的權限範圍,也是root
的):
[hadoop@hadoop root]$ su
密碼:
[root@hadoop ~]# vi /etc/sudoers
...
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL #配置hadoop能夠在哪些地方執行哪些特權命令
...
複製代碼
/etc/sudoers
默認是隻讀的,可經過:wq!
強制保存。
因而hadoop
就能夠執行特權命令了:
[root@hadoop testvi]# su hadoop
[hadoop@hadoop testvi]$ sudo useradd tom
[sudo] password for hadoop:
[hadoop@hadoop testvi]$ sudo passwd tom
更改用戶 tom 的密碼 。
新的 密碼:
無效的密碼: WAY 太短
無效的密碼: 過於簡單
從新輸入新的 密碼:
passwd: 全部的身份驗證令牌已經成功更新。
複製代碼
Linux是沒有磁盤這一律唸的,全部的外設經過掛載到目錄樹上經過訪問文件同樣來訪問。
以訪問光驅爲例,咱們在安裝系統的時候設置了使用CentOS-6.7-x86_64-bin-DVD1.iso
,接着咱們將其掛載到目錄樹上。
首先咱們要將這個光驅(映像文件)「插入」虛擬機:
它會被默認掛載到/media
下,咱們能夠經過/media
來訪問:
[root@hadoop media]# ls
CentOS_6.7_Final
[root@hadoop media]# cd CentOS_6.7_Final/
[root@hadoop CentOS_6.7_Final]# ls
CentOS_BuildTag GPL Packages RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Testing-6
EFI images RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Debug-6 TRANS.TBL
EULA isolinux repodata RPM-GPG-KEY-CentOS-Security-6
複製代碼
可是光驅實體是/dev/cdrom
,咱們能夠手動將其掛載到一個自定義的目錄/mnt/cdrom
中:
[root@hadoop CentOS_6.7_Final]# mkdir /mnt/cdrom
[root@hadoop CentOS_6.7_Final]# mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/
[root@hadoop CentOS_6.7_Final]# ll /mnt/cdrom/
總用量 558
-r--r--r--. 2 root root 14 8月 5 2015 CentOS_BuildTag
dr-xr-xr-x. 3 root root 2048 8月 5 2015 EFI
-r--r--r--. 2 root root 212 11月 27 2013 EULA
-r--r--r--. 2 root root 18009 11月 27 2013 GPL
dr-xr-xr-x. 3 root root 2048 8月 5 2015 images
dr-xr-xr-x. 2 root root 2048 8月 5 2015 isolinux
dr-xr-xr-x. 2 root root 528384 8月 5 2015 Packages
-r--r--r--. 2 root root 1354 7月 25 2015 RELEASE-NOTES-en-US.html
dr-xr-xr-x. 2 root root 4096 8月 5 2015 repodata
-r--r--r--. 2 root root 1706 11月 27 2013 RPM-GPG-KEY-CentOS-6
-r--r--r--. 2 root root 1730 11月 27 2013 RPM-GPG-KEY-CentOS-Debug-6
-r--r--r--. 2 root root 1730 11月 27 2013 RPM-GPG-KEY-CentOS-Security-6
-r--r--r--. 2 root root 1734 11月 27 2013 RPM-GPG-KEY-CentOS-Testing-6
-r--r--r--. 1 root root 3380 8月 5 2015 TRANS.TBL
複製代碼
其中-t iso9660
是指文件系統類型,-o ro
是指掛載後的目錄read only
。
umount
則可取消掛載:
[root@hadoop CentOS_6.7_Final]# umount /mnt/cdrom/
[root@hadoop CentOS_6.7_Final]# ls /mnt/cdrom/
[root@hadoop CentOS_6.7_Final]#
複製代碼
uname
,查看系統基本信息,如OS位數
free -m,查看內存使用狀況,以MB爲單位
top
,查看進程列表至關於打開任務管理器,q
退出
hostname
,查看或設置主機名
[root@hadoop testvi]# hostname
hadoop.com
[root@hadoop testvi]# hostname hadoop01
[root@hadoop testvi]# hostname
hadoop01
複製代碼
但此設置在重啓後就會失效,要想永久生效須要修改/etc/sysconfig/network
:
[root@hadoop testvi]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop01
NTPSERVERARGS=iburst
複製代碼
ifconfig eth0 <new ip>
,修改IP,重啓後失效。永久生效需使用setup
或修改/etc/sysconfig/network-scripts/ifcfg-eth0
df -h
,查看磁盤信息:
[root@hadoop CentOS_6.7_Final]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_hadoop-lv_root
18G 3.6G 13G 22% /
tmpfs 996M 224K 996M 1% /dev/shm
/dev/sda1 477M 42M 410M 10% /boot
/dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.7_Final
複製代碼
du -sh
,查看文件大小
[root@hadoop ~]# ll
總用量 104
-rw-------. 1 root root 1615 6月 4 2019 anaconda-ks.cfg
-rw-r--r--. 1 root root 46328 6月 4 2019 install.log
-rw-r--r--. 1 root root 10033 6月 4 2019 install.log.syslog
drwxr-xr-x. 2 root root 4096 6月 4 15:25 testvi
drwxr-xr-x. 2 root root 4096 6月 4 2019 公共的
drwxr-xr-x. 2 root root 4096 6月 4 2019 模板
drwxr-xr-x. 2 root root 4096 6月 4 2019 視頻
drwxr-xr-x. 2 root root 4096 6月 4 2019 圖片
drwxr-xr-x. 2 root root 4096 6月 4 2019 文檔
drwxr-xr-x. 2 root root 4096 6月 4 2019 下載
drwxr-xr-x. 2 root root 4096 6月 4 2019 音樂
drwxr-xr-x. 2 root root 4096 6月 4 2019 桌面
[root@hadoop ~]# du -sh *
4.0K anaconda-ks.cfg
52K install.log
12K install.log.syslog
20K testvi
4.0K 公共的
4.0K 模板
4.0K 視頻
4.0K 圖片
4.0K 文檔
4.0K 下載
4.0K 音樂
4.0K 桌面
複製代碼
service
service --status-all
,查看全部服務的運行狀態,相似於Windows下的services.msc
service <process> stop
,中止某服務service <process> status
,查看某服務的狀態service <process> start
,啓用某服務service <process> restart
,重啓某服務chkconfig
,設置服務啓動類型
chkconfig iptables off
,設置防火牆開機不自啓chkconfig iptables on
,設置開機自啓chkconfig iptables --list
,查看防火牆啓動類型(分6種Linux啓動模式,可在/etc/inittab
中查看)netstat -nltp
,查看正在監聽的端口及其服務wget
從網上下載MobaXterm
,能夠直接拖拽文件到Linux目錄樹SecureCRT
,在命令行中使用ALT + P
激活sftp
工具,使用put
命令跟上安裝包在你宿主機上的全路徑(或直接拖入)。在sftp
環境下可以使用的命令:
put <filepath>
,將宿主機上的文件上傳到虛擬機,默認上傳到當前用戶的主目錄get <filepath>
,將虛擬機上的文件下載到宿主機cd <path>
,設置上傳到虛擬機的文件的保存目錄lcd <path>
,設置下載到宿主機的文件的保存目錄,如lcd d:/
gzip
,壓縮/解壓
gzip <file>
,壓縮,後綴gz
gzip -d <file>
,解壓
[root@mini01 ~]# ls
anaconda-ks.cfg install.log install.log.syslog
[root@mini01 ~]# gzip install.log
[root@mini01 ~]# ls
anaconda-ks.cfg install.log.gz install.log.syslog
[root@mini01 ~]# gzip -d install.log.gz
[root@mini01 ~]# ls
anaconda-ks.cfg install.log install.log.syslog
複製代碼
tar
,打包/解包
tar -cvf <target> <source1> <source2> ...
[root@mini01 ~]# mkdir aaa
[root@mini01 ~]# mkdir bbb
[root@mini01 ~]# echo 11 > aaa/1.txt
[root@mini01 ~]# echo 22 > bbb/2.txt
[root@mini01 ~]# tar cvf mypackage.tar aaa bbb
aaa/
aaa/1.txt
bbb/
bbb/2.txt
[root@mini01 ~]# ls
aaa anaconda-ks.cfg bbb install.log install.log.syslog mypackage.tar
複製代碼
-c
:建立一個tar
包,-v
顯示包含了哪些文件,-f <target>
指定打包生成文件的名稱
tar -xvf <tar>
[root@mini01 ~]# rm -rf aaa bbb
[root@mini01 ~]# tar xvf mypackage.tar
aaa/
aaa/1.txt
bbb/
bbb/2.txt
[root@mini01 ~]# ls
aaa anaconda-ks.cfg bbb install.log install.log.syslog mypackage.tar
複製代碼
一般打包和壓縮一次性完成:
tar zcvf
,解壓和解包也是:tar zxvf
(可經過-C <path>
指定解壓到指定目錄)
在/etc/profile
中配置,source /etc/profile
使之生效
RPM是軟件包管理器
rpm -ivh xxx.rpm
安裝某個軟件包rmp -e xxx –-nodeps
,若是已有的軟件A和要安裝的軟件包B衝突,可用此先刪除再安裝;若是已有的軟件C依賴軟件A,那麼就要添加--nodeps
忽略刪除致使的後果並強行刪除。rpm -qa
,查詢系統中安裝的RPM包做用至關於maven
,幫助咱們一站式解決軟件安裝過程當中的尋找依賴和依賴版本衝突問題。
yum install -y xxx
,不詢問直接安裝軟件及其所需依賴yum list
,列出全部可用的package
和package
組yum clean all
,清除全部緩衝數據yum deplist xxx
,列出一個包全部依賴的包yum remove xxx
,卸載yum repolist
,列出可用的YUM源YUM源其實就是一個保存了多個RPM包的服務器,能夠經過http的方式來檢索、下載並安裝相關的RPM包。可是當開發環境不能聯網時,咱們就須要製做一個本地YUM源。能夠利用咱們安裝虛擬機時用的CentOS-6.7-x86_64-bin-DVD1.iso
,其中就有不少包。
首先咱們要在虛擬機的設置中的CD/DVD
設置爲使用ISO映像文件,再選擇CentOS-6.7-x86_64-bin-DVD1.iso
的路徑。而後右鍵虛擬機->可移動設備->鏈接。將其掛載到目錄樹上:
[root@mini01 ~]# mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
[root@mini01 ~]# ls /mnt/cdrom
CentOS_BuildTag isolinux RPM-GPG-KEY-CentOS-Debug-6
EFI Packages RPM-GPG-KEY-CentOS-Security-6
EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6
GPL repodata TRANS.TBL
images RPM-GPG-KEY-CentOS-6
[root@mini01 ~]# ls /mnt/cdrom/repodata/
40eeab440905d20a31dd7db33fa8724fba260bcb1047fb6488027b85c22876d2-filelists.sqlite.bz2
486d3ee62873814293a1be370640ae9c71863a35c7299eb76739e03369ad0c3f-c6-x86_64-comps.xml.gz
4df092633ebecaeebdd78359a11a3c13f619f22605322e15e5e307beebd8e641-c6-x86_64-comps.xml
80ae77a0d8cca9c7a3d3361feb4efe0c0c9a876679c68aa81c1852b03ce8339a-filelists.xml.gz
baa4a6f9f3595b30299024b2b1dda93276cb7c2cded3ecea35119a140f6ad14f-primary.xml.gz
bd821d6fb163fc5508b3caa407480faa51a2223e6f475da95675b84c716d6474-other.sqlite.bz2
c11b211333eadda7b2e2d0f7fa8ffbf70a1d32d5182babbb43b90427578e2891-primary.sqlite.bz2
c51255b1b9faf7ce2d5ccaf96cf1b2887ec5c3e1524a45f6dee1f1954accbb46-other.xml.gz
repomd.xml
TRANS.TBL
複製代碼
其中的Packages
中就包含了不少經常使用的軟件包,而repodata/xxx.xml
至關於maven
中的pom
,用於找到軟件包的位置以及個軟件包之間的依賴關係。
配置YUM源咱們須要修改/etc/yum.repos.d/
中的配置文件:
[root@mini01 yum.repos.d]# ls
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-Debuginfo.repo CentOS-Media.repo
複製代碼
其中Centos-Base.repo
中配置了官方的YUM源,其服務器在國外,若是下載速度慢能夠換成網易的鏡像源(下載網易提供的CentOS-Base.repo
來替換)。CentOS-Media.repo
則是配置本地YUM源的一個模板,咱們將其指向剛掛載的/mnt/cdrom
(也即repodata
所在的目錄):
[root@mini01 yum.repos.d]# vi CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
gpgcheck=1
enabled=1 #設置爲1才啓用
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
複製代碼
僅使用該YUM源時能夠將其它幾個YUM源配置文件改名,以避免影響:
[root@mini01 yum.repos.d]# rename .repo .repo.bak *
[root@mini01 yum.repos.d]# mv CentOS-Media.repo.bak CentOS-Media.repo
[root@mini01 yum.repos.d]# ls
CentOS-Base.repo.bak CentOS-fasttrack.repo.bak CentOS-Vault.repo.bak
CentOS-Debuginfo.repo.bak CentOS-Media.repo
複製代碼
yum clean all
清除緩衝,yum repolist
查看可用YUM源:
[root@mini01 yum.repos.d]# yum clean all
已加載插件:fastestmirror
Cleaning repos: c6-media
清理一切
Cleaning up list of fastest mirrors
[root@mini01 yum.repos.d]# yum repolist
已加載插件:fastestmirror
Determining fastest mirrors
c6-media | 4.0 kB 00:00 ...
c6-media/primary_db | 4.6 MB 00:00 ...
倉庫標識 倉庫名稱 狀態
c6-media CentOS-6 - Media 6,575
repolist: 6,575
複製代碼
MySQL-5.5.37-1.el6.x86_64.rpm-bundle.tar
,MySQL相關組件安裝包集
將bundle
上傳至虛擬機並解壓:
[root@hadoop01 ~]# mkdir mysql-bundle
[root@hadoop01 ~]# tar xvf MySQL-5.5.37-1.el6.x86_64.rpm-bundle.tar -C mysql-bundle/
MySQL-shared-compat-5.5.37-1.el6.x86_64.rpm
MySQL-server-5.5.37-1.el6.x86_64.rpm
MySQL-devel-5.5.37-1.el6.x86_64.rpm
MySQL-embedded-5.5.37-1.el6.x86_64.rpm
MySQL-client-5.5.37-1.el6.x86_64.rpm
MySQL-test-5.5.37-1.el6.x86_64.rpm
MySQL-shared-5.5.37-1.el6.x86_64.rpm
[root@hadoop01 ~]# cd mysql-bundle/
[root@hadoop01 mysql-bundle]# ls
MySQL-client-5.5.37-1.el6.x86_64.rpm MySQL-shared-5.5.37-1.el6.x86_64.rpm
MySQL-devel-5.5.37-1.el6.x86_64.rpm MySQL-shared-compat-5.5.37-1.el6.x86_64.rpm
MySQL-embedded-5.5.37-1.el6.x86_64.rpm MySQL-test-5.5.37-1.el6.x86_64.rpm
MySQL-server-5.5.37-1.el6.x86_64.rpm
複製代碼
安裝MySQL
服務器:
[root@hadoop01 mysql-bundle]# rpm -ivh MySQL-server-5.5.37-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
file /usr/share/mysql/charsets/Index.xml from install of MySQL-server-5.5.37-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.73-5.el6_6.x86_64
file /usr/share/mysql/charsets/armscii8.xml from install of MySQL-server-5.5.37-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.73-5.el6_6.x86_64
...
複製代碼
上述報錯,說咱們安裝的MySQL-server-5.5.37
和mysql-libs-5.1.73
有衝突,後者多是安裝系統時自帶的,咱們將後者刪除在安裝:
[root@hadoop01 mysql-bundle]# rpm -e mysql-libs-5.1.73-5.el6_6.x86_64 --nodesps
--nodesps: 未知的選項
[root@hadoop01 mysql-bundle]# rpm -e mysql-libs-5.1.73-5.el6_6.x86_64 --nodeps
[root@hadoop01 mysql-bundle]# rpm -ivh MySQL-server-5.5.37-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:MySQL-server ########################################### [100%]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h hadoop01 password 'new-password'
Alternatively you can run:
/usr/bin/mysql_secure_installation
which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.
See the manual for more instructions.
Please report any problems at http://bugs.mysql.com/
複製代碼
上述提示咱們要設置MySQL的root密碼,首先要啓動服務,而後使用/usr/bin/mysqladmin
或/usr/bin/mysql_secure_installaion
命令:
[root@hadoop01 mysql-bundle]# /usr/bin/mysql_secure_installation
Can't find a 'mysql' client in PATH or ./bin
複製代碼
它又提示沒有安裝mysql client
,因而咱們先安裝它:
[root@hadoop01 mysql-bundle]# rpm -ivh MySQL-client-5.5.37-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:MySQL-client ########################################### [100%]
[root@hadoop01 mysql-bundle]# /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): #回車
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] Y
New password: #設置root密碼,我設置爲root
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n #是否禁止遠程登陸
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y #刷新權限表,必須是y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
複製代碼
因而就可使用MySQL了:
[root@hadoop01 mysql-bundle]# mysql -uroot -proot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
複製代碼
bash
+ 腳本
sh
+ 腳本
[root@mini01 ~]# mkdir shell
[root@mini01 ~]# cd shell/
[root@mini01 shell]# vi helloworld.sh
#!/bin/bash
echo helloworld
[root@mini01 shell]# bash helloworld.sh
helloworld
[root@mini01 shell]# sh helloworld.sh
helloworld
[root@mini01 shell]#
複製代碼
最好養成在腳本行首註明用哪一個解釋器解釋執行的習慣!
賦予執行權限直接運行:
[root@mini01 shell]# chmod u+x helloworld.sh
[root@mini01 shell]# ./helloworld.sh
helloworld
複製代碼
在當前bash環境下運行:
[root@mini01 shell]# vi helloworld.sh
#!/bin/bash
aaa=helloworld
[root@mini01 shell]# ./helloworld.sh
[root@mini01 shell]# echo $aaa
[root@mini01 shell]# . ./helloworld.sh
[root@mini01 shell]# echo $aaa
helloworld
複製代碼
若是直接經過腳本路徑執行腳本那麼會讓其在一個新的bash環境下執行,若是在前面再加上一個.
則會在當前bash環境下執行,bash環境不一樣的腳本之間沒法共享變量。
[root@mini01 shell]# vi helloworld.sh
#!/bin/bash
aaa=helloworld
sleep 20
[root@mini01 shell]# . ./helloworld.sh &
[1] 1483
[root@mini01 shell]# pstree
init─┬─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─sshd───bash─┬─bash───sleep
│ │ └─pstree
│ └─sshd───sftp-server
└─udevd───2*[udevd]
複製代碼
set
,查看當前的環境變量有哪些
unset 變量名
,撤銷變量,但readonly
定義的變量沒法撤銷
$變量名
,引用變量
[root@mini01 shell]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@mini01 shell]# echo $PWD
/root/shell
複製代碼
變量名=變量值
,該變量僅在本次會話內有效(即在重啓後或其餘會話內無效),要想永久生效需在/etc/profile
中配置並使用source /etc/profile
刷新
變量名="變量值"
,當變量值包含空格時需用雙引號將其總體括起來,以將空格脫意(空格的本意是用來分割命令和參數、參數和參數)
[root@mini01 shell]# aaa=hello world
-bash: world: command not found
[root@mini01 shell]# aaa="hello world"
[root@mini01 shell]#
複製代碼
但雙引號僅使變量值中的空格脫意,其餘特殊字符如變量引用符$
則仍然解析:
[root@mini01 shell]# x=hello
[root@mini01 shell]# y="$x world"
[root@mini01 shell]# echo $y
hello world
複製代碼
這時要想y的變量值原樣顯示,則需使用單引號
變量名='變量值'
,單引號會脫意變量值中的任何特殊字符
[root@mini01 shell]# y='$x world'
[root@mini01 shell]# echo $y
$x world
複製代碼
export 變量名
,能夠將變量提高爲全局變量,可供其餘shell使。source
就是將文件中的export
執行一遍。
變量名=$(命令)
(或使用反引號)能夠將命令的執行結果做爲變量值複製給變量:
[root@mini01 shell]# wc -c helloworld.sh
36 helloworld.sh
[root@mini01 shell]# wc -c helloworld.sh | cut -d ' ' -f 1 #統計文件的字節數
36
[root@mini01 shell]# wordcount=`wc -c helloworld.sh | cut -d ' ' -f1`
[root@mini01 shell]# echo $wordcount
36
[root@mini01 shell]# wordcount=$(wc -c helloworld.sh | cut -d ' ' -f1)
[root@mini01 shell]# echo $wordcount
36
複製代碼
$?
,上一條命令的退出狀態(即程序返回值),若是程序沒有返回值則表示程序退出的狀態碼,那麼$?
爲0表示成功執行,非0
則表示執行失敗
[root@mini01 shell]# ls -la
總用量 12 #這些只是命令執行過程當中的輸出而不是返回值
drwxr-xr-x. 2 root root 4096 6月 7 19:41 .
dr-xr-x---. 6 root root 4096 6月 7 19:43 ..
-rwxr--r--. 1 root root 36 6月 7 19:41 helloworld.sh
[root@mini01 shell]# echo $?
0
[root@mini01 shell]# lss
-bash: lss: command not found
[root@mini01 shell]# echo $?
127
複製代碼
若是程序有返回值,那麼$?
就是該值(如true
和false
就有返回值):
[root@mini01 shell]# true
[root@mini01 shell]# echo $?
0
[root@mini01 shell]# false
[root@mini01 shell]# echo $?
1
複製代碼
$$
,當前進程編號
$0
,當前腳本名稱
$#
,參數個數
$*
/$@
,參數列表
[root@mini01 shell]# vi helloworld.sh
#!/bin/bash
for p in $*
do
echo $p
done
for p in $@
do
echo $p
done
[root@mini01 shell]# ./helloworld.sh p1 p2 p3 p4
p1
p2
p3
p4
p1
p2
p3
p4
複製代碼
二者的區別是,加雙引號時,「$*」
會做爲一個總體,而「$@」
仍然以「$1」 「$2」 「$3」...
的形式存在:
[root@mini01 shell]# vi helloworld.sh
#!/bin/bash
for p in "$*"
do
echo $p
done
for p in "$@"
do
echo $p
done
[root@mini01 shell]# ./helloworld.sh p1 p2 p3 p4
p1 p2 p3 p4
p1
p2
p3
p4
複製代碼
$n
,n位置的輸入參數,n表明數字
格式:expr m + n
或$((m+n))
,注意:expr
以及+
的兩邊必須有一個空格
以(2+3)*4
的計算爲例:
[root@mini01 shell]# res=(2+3)*4
[root@mini01 shell]# echo $res
(2+3)*4
[root@mini01 shell]# res=`expr 2 + 3`
[root@mini01 shell]# echo $res
5
[root@mini01 shell]# expr $res \* 4
20
複製代碼
一步得出結果:
[root@mini01 shell]# res=`expr \`expr 2 + 3\` \* 4`
[root@mini01 shell]# echo $res
20
[root@mini01 shell]# res=$(((2+3)*4))
[root@mini01 shell]# echo $res
20
複製代碼
格式:[ <condition> ]
,注意[
的右側和]
的左側要有一個空格。
數字的比較:
lt less than, gt great than, le less than or equal to, ge great than or equal to, eq equal to, ne not equal to
字符串比較:
=
可使用$?
檢測條件表達式的正確性,0爲true,>0爲false:
[root@mini01 shell]# [ 2 -gt 1 ]
[root@mini01 shell]# echo $?
0
[root@mini01 shell]# [ 2 -eq 3 ]
[root@mini01 shell]# echo $?
1
複製代碼
字符串的判斷爲true:
[root@mini01 shell]# [ abc ]
[root@mini01 shell]# echo $?
0
複製代碼
能夠藉助&&
和||
實現若是condition1
成立則執行command1
不然執行command2
的效果:
[root@mini01 shell]# [ 1 -gt 2 ] && echo yes || echo no
no
複製代碼
文件相關的判斷[ -r xx.sh]
:
for in
[root@mini01 shell]# for N in 1 2 3
> do
> echo $N
> done
1
2
3
[root@mini01 shell]# for N in 1 2 3;do echo $N;done
1
2
3
[root@mini01 shell]# for N in {1..3}
> do
> echo $N
> done
1
2
3
複製代碼
for ((i=n;i<m;i++))
[root@mini01 shell]# for ((i=1;i<=5;i++));do echo $i;done
1
2
3
4
5
[root@mini01 shell]# for ((i=1;i<=5;i++))
> do
> echo $i
> done
1
2
3
4
5
複製代碼
while [ <condition> ];do <command>;done
[root@mini01 shell]# while [ 2 -gt 1 ]
> do
> echo "aa"
> done
aa
aa
aa
aa
...
複製代碼
注意:[
、]
、-gt
的兩邊都必需要有一個空格。
while ((<condition>));do <command>;done
[root@mini01 shell]# while ((i<=5))
> do
> echo $i
> let i++
> done
1
2
3
4
5
複製代碼
格式:
case <var> in
item1)
<command>
;;
item2)
<command>
;;
...
*)
<command>
esac
複製代碼
例:
[root@mini01 shell]# vi test-case.sh
#!/bin/bash
case $1 in
start)
echo "starting..."
;;
stop)
echo "stopping.."
;;
*)
please enter "start" or "stop"
esac
[root@mini01 shell]# sh test-case.sh start
starting...
複製代碼
格式:read -p <提示信息> <變量名>
,提示並獲取用戶的輸入(-p
指定提示信息),例:
[root@mini01 shell]# sh test-read.sh
please enter your password:123
your input is 123
複製代碼
格式:
if [ <condition> ]
then
<command>
elif [ <condition> ]
then
<command>
elif [ <condition> ]
then
<command>
else
<command>
fi
複製代碼
例:
[root@mini01 shell]# vi test-if.sh
#!/bin/bash
read -p "please input your grade:" GRADE
if [ $GRADE -ge 90 ]
then echo A
elif [ $GRADE -ge 60 ]
then echo B
else
echo C
fi
[root@mini01 shell]# sh test-if.sh 86
please input your grade:86
B
[root@mini01 shell]# sh test-if.sh
please input your grade:86
B
[root@mini01 shell]# sh test-if.sh
please input your grade:54
C
[root@mini01 shell]# sh test-if.sh
please input your grade:99
A
複製代碼
格式:
function <函數名>() / function <函數名> / <函數名>()
{
action...
return <int:0~255>
}
複製代碼
例:
[root@mini01 shell]# vi sum.sh
#!/bin/bash
function sum()
{
return `expr $1 + $2`;
}
sum 1 2;
res=$?;
echo $res;
[root@mini01 shell]# sh sum.sh
3
複製代碼
注意:
1.必須在調用函數地方以前,先聲明函數,shell腳本是逐行運行。不會像其它語言同樣先預編譯
2.函數返回值,只能經過
$?
系統變量得到,函數體末尾能夠顯式地加return
返回,若是不加,將以最後一條命令運行結果,做爲返回值。return
後跟數值n(0-255)
sh -vx xx.sh
[root@mini01 shell]# vi sum.sh
#!/bin/bash
function sum()
{
return `expr $1 + $2`;
}
sum 1 2;
res=$?;
echo $res;
[root@mini01 shell]# sh -vx sum.sh
#!/bin/bash
function sum()
{
return `expr $1 + $2`;
}
sum 1 2;
+ sum 1 2
expr $1 + $2
++ expr 1 + 2
+ return 3
res=$?;
+ res=3
echo $res;
+ echo 3
3
複製代碼
cut命令能夠從一個文本文件或者文本流中提取文本列:
cut -d'分隔字符' -f fields
,以分隔符分割並取出第fields
列
-d
,delimiters-f
,fregmentcut -c 字符區間
,以字符 (characters) 的單位取出固定字符區間
-c
,characters例:PATH 變量以下:
[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
# 1 | 2 | 3 | 4 | 5 | 6 | 7
複製代碼
將 PATH 變量取出,我要找出第五個路徑:
#echo $PATH | cut -d ':' -f 5
/usr/local/bin
複製代碼
將 PATH 變量取出,我要找出第三和第五個路徑:
#echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin
複製代碼
將 PATH 變量取出,我要找出第三到最後一個路徑:
echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
複製代碼
將 PATH 變量取出,我要找出第一到第三個路徑:
#echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:
複製代碼
查看/etc/passwd
,只顯示其中的用戶及其默認使用的shell解析器
[root@mini01 shell]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@mini01 shell]# cat /etc/passwd | cut -d ':' -f 1,7
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
mail:/sbin/nologin
uucp:/sbin/nologin
operator:/sbin/nologin
games:/sbin/nologin
gopher:/sbin/nologin
ftp:/sbin/nologin
nobody:/sbin/nologin
dbus:/sbin/nologin
vcsa:/sbin/nologin
saslauth:/sbin/nologin
postfix:/sbin/nologin
sshd:/sbin/nologin
複製代碼
命令對file
參數指定的文件或標準輸入流中的行排序,並將結果寫到標準輸出。若是file
參數指定多個文件,那麼 sort 命令將這些文件鏈接起來,並看成一個文件進行排序。
-t
指定域分隔符-k
指定按第幾個列排序-n
按照純數字排序(默認以文本形式按照字典序排序)-r
逆序,reverse-u
去重,unique查看/etc/passwd
並以用戶名排序:
[root@mini01 shell]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
...
複製代碼
以用戶ID排序(即每行以冒號分隔的第三列排序):
[root@mini01 shell]# cat /etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
複製代碼
對/etc/passwd
,先以第六個域的第2個字符到第4個字符進行正向排序,再基於第一個域進行反向排序:
cat /etc/passwd | sort -t':' -k 6.2,6.4 -k 1r
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
...
複製代碼
uniq命令能夠去除排序過的文件中的重複行,所以uniq常常和sort合用。也就是說,爲了使uniq起做用,全部的重複行必須是相鄰的。
例:testfile的內容以下
cat testfile
hello
world
friend
hello
world
hello
複製代碼
未經排序時使用uniq
沒有效果:
uniq testfile
hello
world
friend
hello
world
hello
複製代碼
排序並去重:
cat testfile | sort |uniq
friend
hello
world
複製代碼
排序以後刪除重複行,同時在行首位置輸出該行重複的次數:
sort testfile | uniq -c
1 friend
3 hello
2 world
複製代碼
[root@mini01 shell]# wc --help
用法:wc [選項]... [文件]...
輸出每一個指定文件的行數、單詞計數和字節數
-m, --chars 輸出字符數統計
-l, --lines 輸出行數統計
-w, --words 顯示單詞計數
複製代碼
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。
sed '2d' example
-----刪除example文件的第二行。
-i
則將修改後的內容覆蓋源文件sed '2,$d' example
-----刪除example文件的第二行到末尾全部行。sed '$d' example
-----刪除example文件的最後一行。sed '/test/'d example
-----刪除example文件全部包含test的行。sed 's/test/mytest/g' example
-----在整行範圍內把test替換爲mytest。若是沒有g標記,則只有每行第一個匹配的test被替換成mytest。sed -n 's/^test/mytest/p' example
-----(-n)選項和p標誌一塊兒使用表示只打印那些發生替換的行。也就是說,若是某一行開頭的test被替換成mytest,就打印它。sed 's/^192.168.0.1/&localhost/' example
-----&符號表示替換換字符串中被找到的部份。全部以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost
。sed -n 's/\(love\)able/\1rs/p' example
-----love被標記爲1,全部loveable會被替換成lovers,並且替換的行會被打印出來。sed 's#10#100#g' example
-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,因此,「#」在這裏是分隔符,代替了默認的「/」分隔符。表示把全部10替換成100。sed -n '/test/,/check/p' example
-----全部在模板test和check所肯定的範圍內的行都被打印。sed -n '5,/^test/p' example
-----打印從第五行開始到第一個包含以test開始的行之間的全部行。sed '/test/,/check/s/$/sed test/' example
-----對於模板test和west之間的行,每行的末尾用字符串sed test替換。sed -e '1,5d' -e 's/test/check/' example
-----(-e)選項容許在同一行裏執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執 行順序對結果有影響。若是兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。sed --expression='s/test/check/' --expression='/love/d' example
-----一個比-e更好的命令是--expression。它能給sed表達式賦值。是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤其強大。簡單來講awk就是把文件逐行的讀入,以空格和Tab爲默認分隔符將每行切片,切開的部分再進行各類分析處理。如查看最近5次登錄的用戶:
[root@mini01 shell]# last -n 5
root pts/1 192.168.25.2 Fri Jun 7 19:43 - 19:44 (00:00)
root pts/0 192.168.25.2 Fri Jun 7 19:20 still logged in
reboot system boot 2.6.32-573.el6.x Fri Jun 7 19:19 - 00:51 (05:32)
root pts/0 192.168.25.2 Fri Jun 7 02:33 - 04:54 (02:20)
reboot system boot 2.6.32-573.el6.x Fri Jun 7 02:23 - 00:51 (22:28)
wtmp begins Thu Jun 6 17:35:18 2019
[root@mini01 shell]# last -n 5 | awk '{print $1}'
root
root
reboot
root
reboot
複製代碼
每行都會執行action : {print $1}
awk中同時提供了print
和printf
兩種打印輸出的函數:
print
函數的參數能夠是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。若是沒有逗號,參數就串聯在一塊兒而沒法區分。這裏,逗號的做用與輸出文件的分隔符的做用是同樣的,只是後者是空格而已。printf
函數,其用法和c語言中printf基本類似,能夠格式化字符串,輸出複雜時,printf更加好用,代碼更易懂-F
指定分隔符,只顯示/etc/passwd
的帳戶:
cat /etc/passwd |awk -F ':' '{print $1}'
root
daemon
bin
sys
...
複製代碼
顯示/etc/passwd
的帳戶和帳戶對應的shell,而帳戶與shell之間以Tab鍵分割:
cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
複製代碼
顯示/etc/passwd
的帳戶和帳戶對應的shell,而帳戶與shell之間以逗號分割,並且在全部行添加列名name,shell,在最後一行添加"blue,/bin/nosh"
:
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
複製代碼
awk工做流程是這樣的:先執行BEGING,而後讀取文件,讀入有/n換行符分割的一條記錄,而後將記錄按指定的域分隔符劃分域,填充域,$0則表示全部域,n表示第n個域,隨後開始執行模式所對應的動做action。接着開始讀入第二條記錄······直到全部的記錄都讀完,最後執行END操做。
搜索/etc/passwd
有root關鍵字的全部行:
awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
複製代碼
匹配了pattern(這裏是
‘/root/’
)的行纔會執行action(沒有指定action,默認輸出每行的內容)。搜索支持正則
搜索/etc/passwd
有root關鍵字的全部行,並顯示對應的shell:
awk -F: '/root/{print $7}' /etc/passwd
/bin/bash
複製代碼