【自用】Linux
Linux
Linux檢視檔案內容相關指令
cat:獲取展示檔案的所有內容 (tac 從後往前顯示 cat命令倒置)
nl:顯示非空行檔案內容同時顯示行號 (cat -n 顯示檔案所有行的行號)
more/less:一行一行顯示檔案內容 不同的是less可以上下翻頁
head/tail:只檢視檔案頭/尾幾行
od:以某種編碼形式檢視檔案 (-h 以十六進位制檢視 -c以字元形式檢視)
wc:顯示檔案資訊(顯示形式:行數、單詞數、字元數)
diff:檢視兩個檔案的差異
用法:diff 1.txt 2.txt
顯示錶達式如下:
0a1 --在1.txt 檔案的第0行加了一行
3c3 --兩個檔案在第三個有所不同
uniq:顯示出刪除檔案重複行的結果 -c顯示出重複行的數量
Chmod命令
ls-l命令 列出檢視一個目錄下的檔案和子目錄的詳悉資訊
ls -ld 顯示當前目錄的詳細資訊
第一個字元
p表示命名管道檔案
d表示目錄檔案
l表示符號連線檔案
-表示普通檔案
s表示socket檔案
c表示字元裝置檔案
b表示塊裝置檔案
Linux/Unix 的檔案呼叫許可權分為三級 : 檔案所有者(Owner)、使用者組(Group)、其它使用者(Other Users)。
chmod命令用於改變指定檔案的許可權(讀寫執行)
相關引數
u表示檔案擁有者,g表示與檔案擁有者同組使用者,o表示其他使用者,a表示所有使用者
+表示增加許可權,-表示取消許可權,=指定許可權
r讀,w寫,x可執行
八進位制表示
案例
特殊許可權位
SUID(Set UID)
有時在檔案的執行位x處會出現's'欄位 ,說明設定了suid
這個許可權位的功能是:只要使用者對某個檔案有執行許可權,那麼當他去執行檔案的時候,系統會預設他會以這個檔案的所有者去執行,一旦檔案執行結束,身份切換也隨即消失。
例如,當一個普通使用者執行passwd命令改密碼,雖說/etc/passwd對於普通使用者來說是沒有任何許可權的,但是因為passwd命令設定了suid,所以普通使用者在執行的時候,相當於以root(/etc/shadow檔案所有者)的身份去修改密碼,但是這個命令結束,普通使用者還是普通使用者。
SGID(Set GID)
與SUID類似,設定後,當一個使用者執行一個檔案,他會認為是與這個檔案所者同組的使用者的身份來執行檔案
SBIT(Sticky Bit)
是很多個使用者在同一個目錄下都能寫檔案和刪除檔案,但是大家都只能操作自己的檔案,不能操作其他人的檔案,只有root和該目錄的所有者才能操作目錄下的檔案。
chgrp
Linux chgrp(英文全拼:change group)命令用於變更檔案或目錄的所屬群組。
chown
Linux chown(英文全拼:change ownerp)命令用於設定檔案所有者和檔案關聯組的命令。
Linux的LVM管理
絕大多數都是使用MBR(Master Boot Recorder)都是通過先對一個硬碟進行分割槽,然後再將該分割槽進行檔案系統的格式化,在Linux系統中如果要使用該分割槽就將其掛載上去即可,windows的話其實底層也就是自動將所有的分割槽掛載好,然後我們就可以對該分割槽進行使用了。
參考:
https://www.cnblogs.com/shoufeng/p/10615452.html 概念
https://zhuanlan.zhihu.com/p/62597195 邏輯捲過程
LVM指Logical Volume Manager,邏輯卷管理,是一種對磁碟空間的動態管理(對比與標準分割槽)
實現方法
一種將一至多個硬碟的分割槽在邏輯上進行組合, 當成一個大硬碟來使用。當硬碟空間不足時, 可以動態地新增其它硬碟的分割槽到已有的卷組中(提高磁碟分割槽管理的靈活性)
未用LVM的壞處
(1) 不同的分割槽相互獨立, 單獨的檔案不能跨分割槽儲存, 容易出現硬碟的利用率不均衡;
(2)如果一個檔案系統/分割槽滿了,按傳統的基於分割槽式的檔案系統,就必須重新分割槽/建立檔案
(3)如果要把硬碟上的多個分割槽合併在一起使用, 只能採用重新分割槽的方式, —— 需要做好資料的備份與恢復.
具體實現
四個邏輯卷基本概念
①PE (Physical Extend) 物理塊
②PV (Physical Volume) 物理卷:可以是整個物理硬碟,可以是raid裝置
③VG (Volume Group) 卷組:一個卷組包含至少一個物理卷
④LV (Logical Volume) 邏輯卷
1.將物理硬碟格式化成PV(Physical Volume 物理卷
將硬碟sda sdb 格式化成PV, 這個過程是將LVM是將底層的硬碟劃分為了一個一個的PE(Physical Extend)。
LVM磁碟管理中PE預設大小為4M,PE就是我們邏輯卷管理的最基本單位.
2.建立一個VG(Volume Group)
在將硬碟格式化成PV以後,我們第二步操作就是建立一個卷組,也就是VG(Volume Group),卷組在這裡我們可以將其抽象化成一個空間池,VG的作用就是用來裝PE的,我們可以把一個或者多個PV加到VG當中,因為在第一步操作時就已經將該硬碟劃分成了多個PE,所以將多個PV加到VG裡面後,VG裡面就存放了許許多多來自不同PV中的PE
我們通過上面的圖片就可以看到,我們格式化了兩塊硬碟,每個硬碟分別格式化成了3個PE,然後將兩塊硬碟的PE都加到了我們的VG當中,那麼我們的VG當中就包含了6個PE,這6個PE就是兩個硬碟的PE之和。通常建立一個卷組的時候我們會為其取一個名字,也就是該VG的名字。
3.基於VG建立我們最後要使用的LV(Logical Volume)
當我們建立好我們的VG以後,這個時候我們建立LV其實就是從VG中拿出我們指定數量的PE
建立邏輯卷其實就是我們從VG中拿出我們指定數量的PE,VG中的PE可以來自不同的PV,我們可以建立的邏輯卷的大小取決於VG當中PE存在的數量,並且我們建立的邏輯卷其大小一定是PE的整數倍(即邏輯卷的大小一定要是4M的整數倍)。
4.將我們建立好的LV進行檔案系統的格式化,然後掛載使用
在建立好LV以後,這個時候我們就能夠對其進行檔案系統的格式化了,
我們最終使用的就是我們剛建立好的LV,其就相當於傳統的檔案管理的分割槽
我們首先要對其進行檔案系統的格式化操作,然後通過mount命令對其進行掛載,
這個時候我們就能夠像使用平常的分割槽一樣來使用我們的邏輯捲了。
LVM總結:
(1)物理磁碟被格式化為PV,空間被劃分為一個個的PE
(2)不同的PV加入到同一個VG中,不同PV的PE全部進入到了VG的PE池內
(3)LV基於PE建立,大小為PE的整數倍,組成LV的PE可能來自不同的物理磁碟
(4)LV現在就直接可以格式化後掛載使用了
(5)LV的擴充縮減實際上就是增加或減少組成該LV的PE數量,其過程不會丟失原始資料
Linux許可權掩碼umask
linux中umask函式主要用於,在建立新檔案或者新目錄的時候,指定使用者建立的新檔案新目錄的許可權預設值
umask預設為0022
0:特殊許可權位
022:使用者許可權位 許可權掩碼值,實際許可權為777-022=755 (rwx r-x r-x)
如果使用者建立的是目錄,則預設所有許可權都開放,為777,預設為:drwxrwxrwx
新建檔案:666-022=644; 新建目錄:777-022=755.
可以更改許可權掩碼
Linux使用者有關
建立新使用者 adduser + 使用者名稱
切換使用者 su+使用者名稱
linux /etc/passwd 檔案
是系統使用者配置檔案,儲存額系統中所有使用者的基本資訊,並且所有使用者都可以對此檔案執行讀操作。
讀者可能會問,Linux 系統中預設怎麼會有這麼多的使用者?這些使用者中的絕大多數是系統或服務正常執行所必需的使用者,這種使用者通常稱為系統使用者或偽使用者。系統使用者無法用來登入系統,但也不能刪除,因為一旦刪除,依賴這些使用者執行的服務或程式就不能正常執行,會導致系統問題。
/etc/passwd展示了七個欄位,分別以冒號隔開
七個欄位詳細資訊如下:
使用者名稱 (magesh): 已建立使用者的使用者名稱,字元長度 1 個到 12 個字元。
密碼(x):代表加密密碼儲存在 /etc/shadow 檔案中。、
使用者 ID(506):代表使用者的 ID 號,每個使用者都要有一個唯一的 ID 。**UID 號為 0 的是為 root 使用者保留的**,UID 號 1 到 99 是為系統使用者保留的,UID 號 100-999 是為系統賬戶和群組保留的。
**群組 ID (**507):代表群組的 ID 號,每個群組都要有一個唯一的 GID ,儲存在 /etc/group檔案中。
**使用者資訊**:代表描述欄位,可以用來描述使用者的資訊
**家目錄**(/home/mageshm):代表使用者的家目錄。
**Shell**(/bin/bash):代表使用者使用的 shell 型別。
Linux /etc/shadow(影子檔案)
/etc/passwd 檔案,由於該檔案允許所有使用者讀取,易導致使用者密碼洩露,因此 Linux 系統將使用者的密碼資訊從 /etc/passwd 檔案中分離出來,並單獨放到了此檔案中。
/etc/shadow 檔案只有 root 使用者擁有讀許可權,其他使用者沒有任何許可權,這樣就保證了使用者密碼的安全性。
內容
使用者名稱:加密密碼:最後一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的警告天數:密碼過期後的寬限時間:賬號失效時間:保留欄位
Find 命令
find -name '*.c' --找出所有.c結尾的檔案(預設指當前目錄下的檔案)
find /tmp -name '*.c' --找出/tmp中所有.c結尾的檔案
find . -type f --將當前目錄下的所有一般檔案列出來
-type 引數意義
d: 目錄
c: 字型裝置檔案
b: 區塊裝置檔案
p: 具名貯列
f: 一般檔案
l: 符號連結
s: socket
find -size 0 --找出當前目錄下的空檔案
-size +1M (大於1M)
-size -1K (小於1K)
find -size 0 -exec ls -l {} ; --找出所有大小為零的檔案並展示詳細資訊
注意 :;前有空格
-exec 將直接執行語句
find -size 0 -ok rm {} ; --找出所有大小為零的檔案並刪除他們
-ok 會讓你是否確定執行
find . -ctime -20 --找出所有最近20天內更新過的檔案
-20 最近20天內
+20 距現在20天前
find . -type f -perm 644 -exec ls -l {} ;
--查詢前目錄中檔案屬主具有讀、寫許可權,並且檔案所屬組的使用者和其他使用者具有讀許可權的檔案:
which命令
顯示在環境變數下符合條件的檔案
sort命令
sort用來對獲取到的資訊進行特定方式的排序
sort 1.txt --預設排序方式是以第一個欄位以ASCII 碼次序排序
sort -u 1.txt --排序忽略重複行
sort -r 1.txt --以預設排序的倒序排序顯示
sort -r 1.txt o 2.txt --將1.txt的逆序重定向到2.txt
sort -n 1.txt --特別指用number即數值的形式排序
sort -k3 1.txt --以第三個欄位排序
sort -t: -k3 1.txt --以冒號作為分隔符,以第三個欄位排序
cut命令
cut命令用來顯示行中的指定部分,刪除檔案中指定欄位。cut經常用來顯示檔案的內容。
試驗文件
[root@localhost text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
cut -f 1 test.txt --顯示test裡面第一個欄位結果
cut -f 2,3 test.txt --顯示text第二、三欄位
cut -f2 -complement test.txt --顯示除了第二個欄位以外內容
cut -d: -f1,2 text.txt --以冒號作為分隔符分隔欄位 ,顯示第一、二欄位
cut -d' ' -f 1,2 1.txt --以空格作為分隔符分隔欄位,顯示第一、二欄位
paste命令
按列合併兩個文字的內容
同樣地,可以用重定位符 :paste ts1 ts2 > ts3.txt
paste -d: ts1 ts2 --d引數指定連線分隔符
grep命令
grep全程global search regular expression(RE) and print out the line。
全域性正則搜尋然後打印出來,是一個強大的搜尋命令
grep 123 1.txt(grep 123 1.txt) --在1.txt裡面搜尋’123'
grep -n 123 1.txt --列印結果顯示行號
grep -v 123 1.txt --列印沒有包含123的結果
grep -i abc 1.txt --查詢過程忽略大小寫
grep -c abc 1.txt --顯示含有abc的行的數量
grep -E --使用延伸型正則表示式 (存在 + ? | () 等符號時使用)建議直接用egrep
sed命令
sed命令用來處理文字
sed -e 4a 123 1.txt --在1.txt 第四行後面新增'123'
nl /etc/passwd | sed '2d' --顯示passwd內容 並且將第二行刪除
nl /etc/passwd | sed '3,$d' --顯示passwd內容 並且將第三行到之後的行刪除
nl /etc/passwd | sed '2i drink tea' --在第二行前一行插入'drink tea'
nl /etc/passwd | sed '2,5c No 2-5 number' --將第2-5行替代成'No 2-5 number'
sed '/[1]*$/d' /tmp/hello.c --刪除空行
sed -i '/[2]*$/d' /tmp/hello.c --刪除空行 並且寫入檔案
sed -n '5,10p' /tmp/databook --列印5-10 行的內容
awk命令
和sed差不多也是處理文字的工具
awk -F: '\ <s18\ ' {print $1,$3} ' /etc/passwd --以冒號作為分隔符 列印s18開頭的專案的第一第三個欄位
awk -F '[ ,]' --設定多個分隔符
awk '$2~/[3]/' /tmp/passwd --列印/tmp/passwd第二列中以kK開頭的行
awk '$4<2.5 ' /tmp/student_record --數學表示式
awk '$3=="CS" && $<3.5' /tmp/student_record --邏輯表示式匹配
正則表示式各種符號:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
重定位與管道符
重定向
重定向分輸入重定向和輸出重定向,即改變輸入輸出方向
正常來說,標準輸入裝置是鍵盤,標準輸出裝置是顯示器
用法
輸出重定向中'>'表示覆蓋 ; ‘ >>’表示追加
也可以使用複合命令
command>file1 2>file2 :以覆蓋的方式,命令的正確輸出結果寫入file1 把錯誤結果寫入file2
(會首先建立兩個檔案file1 file2)
command >file 2>&1 :以覆蓋的方式,命令的正確和錯誤輸出結果都寫入file
輸入重定向
wc -l < /etc/passwd :將/etc/passwd作為輸入執行wc -l(統計行數)
wc -l<<END :將使用特定的分界符‘END’作為命令輸入的結束標誌.
command< input_file>output_file : 將input_file作為輸入檔案執行command命令 輸出到output_file
cate 2>/dev/null : 將輸入的錯誤指令返回結果 丟入dev/null(類似垃圾桶)
管道命令(|)
管道命令可以將一條指令的執行結果做第二條指令的輸入
管道命令只處理前一個命令的正確輸出,不處理錯誤輸出
如圖只有正確的命令執行結果會作為第二條指令的輸入
錯誤的指令直接通過標準輸出列印到螢幕
cat /etc/passddd /etc/passwd 2>/dev/null | grep -n 'root'
將輸入錯誤結果丟入/dev/null 正確指令作為grep的輸入執行
區別
管道觸發兩個子程序執行"|"兩邊的程式;而重定向是在一個程序內執行
linux程序管理
ps命令process status,常用ps -ef 、ps aux檢視程序
兩者區別:是Unix系統的兩種風格,System V 和BSD風格,絕大多數linux都可以同時使用這兩種方式的
ps命令
ps -ef
-e顯示所有程序
-f full顯示詳細資訊
UID | PID | PPID | C | STIME | TTY | TIME | CMD |
---|---|---|---|---|---|---|---|
使用者 | 程序id | 父程序id | cpu百分比 | 啟動時間 | 所在終端 | 程序佔用cpu | 命令引數 |
root | 1 | 0 | 0 | 06:50 | ? | 00:00:10 | /sbin/init |
root | 40 | 1 | 0 | 12:33 | pts/0 | 00:00:03 | /java/ |
?b表示與終端無關 |
ps aux
a顯示所有程序
u使用基於使用者的資訊輸出格式,增加使用者名稱、cpu記憶體佔用率等資訊
x同時顯示沒有控制終端的程序(TTY ?)
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
root | 1 | 0.0 | 1.2 | 19221 | 2989 | ? | S | 12:20 | 00:09 | /sbin/ini |
該程序使用的虛擬記憶體量(KB) | 該程序佔用的固定記憶體量(KB) | 程序的狀態 | 該程序實際使用CPU執行的時間 |
D //無法中斷的休眠狀態(通常 IO 的程序);
R //正在執行可中在佇列中可過行的;
S //處於休眠狀態;
T //停止或被追蹤;
W //進入記憶體交換 (從核心2.6開始無效);
X //死掉的程序 (基本很少見);
Z //殭屍程序;
< //優先順序高的程序
N //優先順序較低的程序
L //有些頁被鎖進記憶體;
s //程序的領導者(在它之下有子程序);
l //多執行緒,克隆執行緒(使用 CLONE_THREAD, 類似 NPTL pthreads);
+ //位於後臺的程序組;
ps -lax
UID | PID | PPID | PRI | NI | WCHAN |
---|---|---|---|---|---|
使用者id | 程序id | 父程序id | 優先順序 | nice值 | 程序正在等待的資源型別 |
越小越優先 | |||||
ps o
o引數可以指定ps輸出的欄位,並且利用某個欄位排序
ps -axo pid,ppid,%mem,%cpu,cmd --sort=-%cpu
顯示指定欄位,用%cpu降序排序
nice命令
程序的nice值 在-20~19之間,nice越小優先順序越大,預設nice為0
nice 可以給要啟動的程序賦予 NI 值,但是不能修改已執行程序的 NI 值。
例如
nice -n -5 sudo service apache2 start
type命令
type命令用來顯示指定命令的型別
linux前後臺切換管理
“後臺任務”的特點
繼承當前session的標準輸出和標準錯誤輸出,因此,後臺任務的所有輸出依舊會在命令列下顯示出來
不繼承當前session的標準輸入,因此,你將無法對該任務輸入命令。如果它試圖讀取標準輸入,就會暫停執行(halt)。
command &
將command指令放在後臺執行
bg
將任務轉為後臺執行
bg%1 將程序號為1的程序轉入後臺執行
fg 將任務轉為前臺執行
bg%2 將程序號為2的程序轉入前臺執行
ctrl Z 停止當前程序,並放入後臺
jobs 顯示當前後臺的程序
linux命令執行操作符
分號(;)可以用作序列執行多條語句 ,如:pwd;who|wc -l
單個與符號(&)cmd1&cmd2 用作兩條指令並行執行
與符號(&&) cmd1&&cmd2 :當cmd1執行成功了,執行cmd2;若cmd1沒有執行,則也不執行cmd2
或符號(||)cmd1&&cmd2 :當cmd1執行成功了,不執行cmd2;若cmd1沒有執行,則執行cmd2
kill命令與訊號量
用來中斷一個程序,無論它是前臺後臺程序
kill -l 檢視所有訊號量
常用:1(HUP)重新載入程序、9(KILL)強制殺死程序、15(TERM)正常停止一個程序
kill -9 pid --強制終止程序
linux計劃任務
Crontab命令
cron服務:指定時間週期性執行某個任務,依賴於系統後臺crond程序
crontab -e 編輯crontab
(分鐘|小時|日|月|周|指令)
crontab -l 檢視計劃
at命令
at服務用於指定某個時間一次性執行某個任務,依賴於系統後臺atd程序
‘at + 時間’進入at指令互動模式
輸入指令ctrl D 退出
at -l / atq --檢視設定的一次性計劃任務
at -c +jobname --檢視一次性計劃任務具體內容(包含一些環境變數)
at -d --刪除計劃任務
命令格式
at 3:30pm
at 15:30
at 10:10 today
at now+2min ——2分鐘後執行
at 4pm + 3 days ——3天以後的下午4點執行此job
at 10am Jul 31 ——在7月31日上午10點執行此job
at 1am tomorrow ——明天上午1點執行此job
at 4:00 2020-12-12 ——在2020-12-12日的凌晨4點執行
at -t 09201430 ——9月20日的下午2:30執行此job
at -t 202009201430 ——2020年的9月20日的下午2:30執行此job
# man at
at now + 5 minutes 任務在5分鐘後執行
at now + 1 hour 任務在1小時後執行
at now + 3 days 任務在3天后執行
at now + 2 weeks 任務在兩週後執行
shell程式設計
通常shell指令碼用.sh 結尾表示,在檔案的開頭寫"#!/bin/bash"
.bash_history:記錄前一次登入以前所執行的命令,這一次登入的命令記錄快取在記憶體中,當登出後寫入.bash_history
內建命令和非內建命令
內建命令如cd、echo、exit等,這些命令由shell程式識別,通常在linux系統載入執行時shell就被載入並駐留在系統內存中。
其執行速度比外部命令快,因為內部命令shell不需要建立子程序。
非內建命令如ls,在系統載入時並不隨系統一起被載入到記憶體中,而是在需要的時候才將其調入記憶體。
對於非內建命令,執行命令過程,會先fork一個子shell,由這個子shell去執行bash的程式碼
而執行內建命令相當於呼叫shell程序的一個函式,不建立新的程序
type命令
用於區別內建命令和非內建命令
type -t name :顯示型別 如file 、alias、builtin
type -p name :當後面跟非內建命令時,顯示完整檔名
type -a name : 顯示出在PATH中 所有包含name的命令
環境變數
foo="hello world" 設定一個區域性變數 (只有當前shell有效)
// foo = ls -l
反單引號內寫命令 可以將命令結果賦給環境變數
echo $foo 輸出環境變數內容
set | grep foo 顯示在使用者的區域性變數和使用者環境變數表中的‘foo’行
env | grep foo顯示在使用者的使用者環境變數表中的‘foo’行
export foo 把使用者區域性變數foo寫入環境變數
set、env和export區別
env是環境變數的縮寫,指列出所有環境變數
export也是列出環境變數 ,但相比起env,更詳細
set 用來檢視所有變數 包含環境變數和自定義變數
設定環境變數的方法
- /etc/profile中新增,所有使用者有效
- /etc/.bash_profile 中新增,單一使用者有效
- export 變數名 當前shell有效
- declear -x 變數名
source命令
source命令用來在當前bash環境下讀取並執行檔案 ,和. 的用法一樣