数据整理与命令行环境
數(shù)據(jù)整理
正則表達式
介紹
- 正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等
- 正則表達式通常以(盡管并不總是) / 開始和結(jié)束
簡單字符
- 沒有特殊意義的字符都是簡單字符,簡單字符就代表自身,絕大部分字符都是簡單字符
普通字符
| [ABC] | 匹配 [...] 中的所有字符,例如 [aeiou] |
| [^ABC] | 匹配除了 [...] 中字符的所有字符,例如 [^aeiou] |
| [A-Z] | [A-Z] 表示一個區(qū)間,匹配所有大寫字母,[a-z] 表示所有小寫字母 |
| . | 匹配除換行符(\n、\r)之外的任何單個字符,相等于 [^\n\r] |
| [\s\S] | 匹配所有。\s 是匹配所有空白符,包括換行,\S 非空白符,不包括換行 |
| \w | 匹配字母、數(shù)字、下劃線。等價于 [A-Za-z0-9] |
元字符
| ^ | 匹配行首字符 | ^x | 以字符x開始的字符串 |
| $ | 匹配行尾字符 | x$ | 以字符x結(jié)尾的字符串 |
| . | 匹配除換行符之外的任意單個字符 | l..e | love,life,live … |
| ? | 匹配任意一個可選字符 | xy? | x,xy |
| * | 匹配前面字符零次或多次重復(fù) | xy* | x,xy,xyy,xyyy … |
| + | 匹配前面字符一次或多次重復(fù) | xy+ | xy,xyy,xyyy … |
| […] | 匹配任意一個字符 | [xyz] | x,y,z |
| () | 對正則表達式進行分組 | (xy)+ | xy,xyxy,xyxyxy … |
| \{n\} | 匹配n次 | go\{2\}gle | |
| \{n,\} | 匹配最少n次 | go\{2,\}gle | google,gooogle,goooogle … |
| \{n,m\} | 匹配n到m次 | go\{2,4\} | google,gooogle,goooogle |
| {n} | 匹配n次 | go{2}gle | |
| {n,} | 匹配最少n次 | go{2,}gle | google,gooogle,goooogle … |
| {n,m} | 匹配n到m次 | go{2,4}gle | google,gooogle,goooogle |
| | | 以或邏輯連接多個匹配 | good|bon | 匹配good或bon |
| \ | 轉(zhuǎn)義字符 | \* | * |
- 凡是表示范圍的量詞,都優(yōu)先匹配上限而不是下限
- 更多關(guān)于正則表達式,這里有一份簡單的教程,推薦學(xué)習(xí)
修飾符(標記)
- 標記也稱為修飾符,正則表達式的標記用于指定額外的匹配策略
- 標記不寫在正則表達式里,標記位于表達式之外
| i | ignore - 不區(qū)分大小寫 | 將匹配設(shè)置為不區(qū)分大小寫,搜索時不區(qū)分大小寫: A 和 a 沒有區(qū)別 |
| g | global - 全局匹配 | 查找所有的匹配項 |
| m | multi line - 多行匹配 | 使邊界字符 ^ 和 $ 匹配每一行的開頭和結(jié)尾,記住是多行,而不是整個字符串的開頭和結(jié)尾 |
| s | 特殊字符圓點 . 中包含換行符 \n | 默認情況下的圓點 . 是 匹配除換行符 \n 之外的任何字符,加上 s 修飾符之后, . 中包含換行符 \n |
排序命令
sort
sort [-fbnrtuk] [file or stdin]- -f:忽略大小寫
- -b:忽略最前面的空格字符部分
- -n:使用【純數(shù)字】進行排序(默認是以文字形式來排序的)
- -r:反向排序
- u:相同的數(shù)據(jù)中,僅出現(xiàn)一行代表
- -t:分隔符號,默認是用[Tab]鍵來分隔
- -k:以哪個區(qū)間(field)來進行排序的意思
uniq
- 排序完成后,將重復(fù)的數(shù)據(jù)僅列出一個顯示
- -i:忽略大小寫
- -c:進行計數(shù)
Sed
介紹
- Sed是一種功能強大的流式文本編輯器
- 每次僅讀取一行內(nèi)容
- Sed 默認不會直接修改源文件數(shù)據(jù),而是會將數(shù)據(jù)復(fù)制到緩沖區(qū)中,修改也僅限于緩沖區(qū)中的數(shù)據(jù)
- Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復(fù)操作、編寫轉(zhuǎn)換程序等
常用命令
替換
sed 's/book/books/' file # book部分是我們需要使用的正則表達式 # books是用于替換匹配結(jié)果的文本文本注入
sed -i 's/book/books/g' file # 使用后綴 /g 標記會替換每一行中的所有匹配 # 匹配file文件中每一行的所有book替換為books打印特定的行
sed -n 's/test/TEST/p' file # 表示只打印那些發(fā)生替換的行命令行環(huán)境
任務(wù)控制
-
Shell使用Unix提供的信號機制執(zhí)行進程間通信
-
當(dāng)一個進程接收到信號時,它會停止執(zhí)行、處理該信號并基于信號傳遞的信息來改變其執(zhí)行
-
<Ctrl-C>:結(jié)束進程
-
<Ctrl-Z>:暫停進程
-
fg:前臺繼續(xù)
-
bg:后臺繼續(xù)
jobs
- 列出當(dāng)前終端會話中尚未完成的全部任務(wù)
- 基本格式:
- 常用選項及含義
| -l | 列出進程的 PID 號 |
| -n | 只列出上次發(fā)出通知后改變了狀態(tài)的進程 |
| -p | 只列出進程的 PID 號 |
| -r | 只列出運行中的進程 |
| -s | 只列出已停止的進程 |
&后綴
- &后綴讓命令直接在后臺運行
- 一般格式:
- 注意,后臺的進程仍然是終端進程的子進程,一旦關(guān)閉終端,后臺的進程也會停止
nohup
- 用于在系統(tǒng)后臺不掛斷地運行命令,退出終端不會影響程序的運行
- nohup 命令,在默認情況下(非重定向時),會輸出一個名叫 nohup.out 的文件到當(dāng)前目錄下,如果當(dāng)前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中
- 一般格式:
終端多路復(fù)用
介紹
- 在終端同時執(zhí)行多個任務(wù)
- 例如:在終端運行編輯器,同時在終端的另一側(cè)執(zhí)行程序
tmux
- 我們每次打開一個 終端窗口 (screen),可以看作在終端窗口和用戶之間建立了一次 會話 (session),用戶在終端窗口中輸入命令執(zhí)行會創(chuàng)建 進程 ,默認情況下窗口和會話是“綁定的”,也就是說窗口關(guān)閉,會話及會話下面的所有進程都會結(jié)束。我們經(jīng)常通過ssh遠程連接到服務(wù)器,并且執(zhí)行一些長時間運行的程序,如果網(wǎng)絡(luò)斷開,終端窗口關(guān)閉,那么與該窗口關(guān)聯(lián)的會話及其下面的進程都會關(guān)閉,這是十分不方便的。
- tmux可以允許我們基于面板和標簽分割出多個終端窗口,這樣便可以同時與多個shell會話進行交互
- tmux可以將窗口和會話分離,窗口的關(guān)閉不會影響到會話的狀態(tài),會話中運行的進程也不會被中止,在合適的時候,可以新建窗口連接到之前的會話 。
結(jié)構(gòu)和工作流
會話(session)
- 每一個會話都是一個獨立的工作區(qū),其中包含一個或多個窗口
- tmux 開始一個新的會話
- tmux new -s name 以指定名稱開始一個新的會話
- tmux ls 列出當(dāng)前所有會話
窗口(window)
- 相當(dāng)于編輯器或是瀏覽器中的標簽頁,從視覺上將一個會話分割為多個部分
- <Ctrl-B> c 創(chuàng)建一個新窗口,使用<Ctrl-D> 關(guān)閉
- <Ctrl-B> N 跳轉(zhuǎn)到第N個窗口
- <Ctrl-B> p 切換到前一個窗口
- <Ctrl-B> n 切換到下一個窗口
- <Ctrl-B> ,重命名當(dāng)前窗口
- <Ctrl-B> w 列出當(dāng)前所有窗口
面板(pan)
-
像Vim中的分屏一樣,面板使我們可以在一個屏幕里顯示多個shell
-
<Ctrl-B> " 水平分割
-
<Ctrl-B> % 垂直分割
-
<Ctrl-B> <方向> 切換到指定方向的面板
-
<Ctrl-B> z 切換當(dāng)前面板的縮放
-
<Ctrl-B> <space> 在不同的面板排布間切換
-
tmux快速入門教程請看這里,以及這里(包含screen命令)
別名
alias
- 對命令重命名
- 解除使用
- 列出目前已有的命令別名
注意,在默認情況下shell并不會保存別名,為了讓別名持續(xù)生效,需要將配置放進shell的啟動文件里
遠端設(shè)備
SSH服務(wù)
簡介
- SSH 是 Secure Shell protocol 的簡寫 (安全的殼程序協(xié)議),它可以透過數(shù)據(jù)封包加密技術(shù),將等待傳輸?shù)姆獍用芎笤賯鬏數(shù)骄W(wǎng)絡(luò)上
連接服務(wù)器
- 一般格式
- 直接聯(lián)機登陸到對方主機
- 服務(wù)器可以通過URL指定(例如bar.mit.edu),也可以使用IP指定(例如foobar@192.168.1.42)
密鑰
簡介
- 公鑰 (public key):提供給遠程主機進行數(shù)據(jù)加密的行為,也就是說,大家都能取得你的公鑰來將數(shù)據(jù)加密的意思
- 私鑰 (private key):遠程主機使用你的公鑰加密的數(shù)據(jù),在本地端就能夠使用私鑰來進行解密。由于私鑰是這么的重要, 因此私鑰是不能夠外流的!只能保護在自己的主機上
- 由于每部主機都應(yīng)該有自己的密鑰 (公鑰與私鑰),且公鑰用來加密而私鑰用來解密, 其中私鑰不可外流。但因為網(wǎng)絡(luò)聯(lián)機是雙向的,所以,每個人應(yīng)該都要有對方的『公鑰』
密鑰生成
- 用戶的密鑰一般都放在主目錄的.ssh目錄里面
基于密鑰的認證機制
-
用戶公鑰保存在服務(wù)器的~/.ssh/authorized_keys文件。你要以哪個用戶的身份登錄到服務(wù)器,密鑰就必須保存在該用戶主目錄的~/.ssh/authorized_keys文件。只要把公鑰添加到這個文件之中,就相當(dāng)于公鑰上傳到服務(wù)器了
-
ssh 會查詢~/.ssh/authorized_keys 來確認哪些用戶可以被允許登陸
- 注意,authorized_keys文件的權(quán)限要設(shè)為644,即只有文件所有者才能寫。如果權(quán)限設(shè)置不對,SSH 服務(wù)器可能會拒絕讀取該文件
通過SSH復(fù)制文件
模擬 FTP 的文件傳輸方式: sftp
- 這個指令的用法與 ssh 很相似,只是 ssh 是用在登入而 sftp 在上傳/下載文件而已
針對遠方服務(wù)器主機 (Server) 的命令
- 常規(guī)Linux命令
針對本機 (Client) 的命令
- 在命令前面加上l(L的小寫)
針對資料上傳/下載的命令
| 將檔案由遠程主機下載回來 | get [遠程主機目錄或檔案] [本機] get [遠程主機目錄或檔案] 若是這種格式,則檔案會放置在目前本機所在的目錄當(dāng)中!可以使用通配符,例如: get * get *.rpm 亦是可以的格式! |
例如:
- 假設(shè) localhost 為遠程服務(wù)器,且服務(wù)器上有 student 這個使用者。你想要 (1)將本機的 /etc/hosts 上傳到 student 家目錄,并 (2)將 student 的 .bashrc 復(fù)制到本機的 /tmp 底下
檔案異地直接復(fù)制: scp
- 通常使用 sftp 是因為可能不知道服務(wù)器上面有什么檔名的檔案存在,如果已經(jīng)知道服務(wù)器上的檔案檔名了, 那么最簡單的文件傳輸則是透過 scp 這個指令
端口轉(zhuǎn)發(fā)
本地端口轉(zhuǎn)發(fā)
- 通過本地計算機訪問遠程計算機
注意,本地端口轉(zhuǎn)發(fā)采用 HTTP 協(xié)議,不用轉(zhuǎn)成 SOCKS5 協(xié)議
遠程端口轉(zhuǎn)發(fā)
- 通過遠程計算機訪問本地計算機
SSH配置
-
服務(wù)器密鑰系統(tǒng):/etc/ssh/ssh_host*
-
服務(wù)器公鑰記錄文件:~/.ssh/known_hosts
-
sshd 服務(wù)器細部設(shè)定:/etc/ssh/sshd_config
-
本機SSH配置:~/.ssh/config
-
關(guān)于SSH服務(wù),這里有一份資料,這里的資源也挺不錯的。更多關(guān)于遠程聯(lián)機服務(wù)器,請看這里。
總結(jié)
以上是生活随笔為你收集整理的数据整理与命令行环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LVGL开发 | lv_lib_100a
- 下一篇: 人脸识别论文——发现微小的脸