vault backup: 2024-02-17 22:54:05
This commit is contained in:
172
00. Inbox/Linux/CLI/cut.md
Normal file
172
00. Inbox/Linux/CLI/cut.md
Normal file
@@ -0,0 +1,172 @@
|
||||
## cut
|
||||
Linux 的 `cut` 指令是一個實用的文字處理工具,可以將每一行文字的部份字元或欄位擷取出來,以下是使用方式與範例。
|
||||
|
||||
### 擷取字元
|
||||
|
||||
對於欄位寬度是固定的資料,可以使用擷取固定位置字元的方式,把指定的欄位抓出來,典型的例子就是從 `ls` 指令的輸出中擷取檔案權限。假設我們的 `ls` 指令與輸出資料如下:
|
||||
```bash
|
||||
# 僅輸出最後 5 筆檔案資訊
|
||||
ls -l | tail -n 5
|
||||
```
|
||||
|
||||
```
|
||||
drwxr-xr-x 2 gtwang gtwang 4096 11月 7 22:29 影片
|
||||
drwxr-xr-x 7 gtwang gtwang 4096 2月 6 21:01 文件
|
||||
drwxr-xr-x 4 gtwang gtwang 4096 2月 22 21:09 桌面
|
||||
drwxr-xr-x 2 gtwang gtwang 4096 1月 6 2017 模板
|
||||
drwxrwxr-x 2 gtwang gtwang 4096 1月 6 2017 音樂
|
||||
```
|
||||
|
||||
如果我們想要擷取第一欄中的檔案權限(也就是第 2 個字元到第 10 個字元),可以使用 `cut` 指令配合 `-c` 參數,將每一行的第 2 個字元至第 10 個字元抓出來:
|
||||
|
||||
```bash
|
||||
# 擷取第 2 個字元至第 10 個字元
|
||||
ls -l | tail -n 5 | cut -c 2-10
|
||||
```
|
||||
|
||||
Output:
|
||||
```
|
||||
rwxr-xr-x
|
||||
rwxr-xr-x
|
||||
rwxr-xr-x
|
||||
rwxr-xr-x
|
||||
rwxrwxr-x
|
||||
```
|
||||
|
||||
如果要擷取多個不連續的的區段,逗號分隔每個區段,例如:
|
||||
|
||||
```bash
|
||||
# 擷取第 2-3 個、第 5-6 個與第 8-9 個字元
|
||||
ls -l | tail -n 5 | cut -c 2-3,5-6,8-9
|
||||
```
|
||||
|
||||
Output:
|
||||
```
|
||||
rwr-r-
|
||||
rwr-r-
|
||||
rwr-r-
|
||||
rwr-r-
|
||||
rwrwr-
|
||||
```
|
||||
|
||||
### 排除字元
|
||||
|
||||
上面的範例中我們都是設定要擷取的部份,如果想要設定排除的部份,可以加上 `--complement` 這個補集參數,這樣 `cut` 就會將指定的部份刪除,留下剩餘的部份:
|
||||
|
||||
```bash
|
||||
# 排除第 2 個字元至第 10 個字元
|
||||
ls -l | tail -n 5 | cut -c 2-10 --complement
|
||||
```
|
||||
|
||||
Output:
|
||||
```
|
||||
d 2 gtwang gtwang 4096 11月 7 22:29 影片
|
||||
d 7 gtwang gtwang 4096 2月 6 21:01 文件
|
||||
d 4 gtwang gtwang 4096 2月 22 21:09 桌面
|
||||
d 2 gtwang gtwang 4096 1月 6 2017 模板
|
||||
d 2 gtwang gtwang 4096 1月 6 2017 音樂
|
||||
```
|
||||
|
||||
### 擷取欄位
|
||||
|
||||
若我們的資料欄位寬度不是固定的,而是使用特定的字元分隔不同的欄位,例如逗點分隔檔(csv 檔):
|
||||
```
|
||||
5.1,3.5,1.4,0.2,"setosa"
|
||||
4.9,3,1.4,0.2,"setosa"
|
||||
7,3.2,4.7,1.4,"versicolor"
|
||||
6.4,3.2,4.5,1.5,"versicolor"
|
||||
5.9,3,5.1,1.8,"virginica"
|
||||
```
|
||||
|
||||
若要擷取這個 csv 檔的特定欄位,可以使用 `cut` 指令加上 `-d` 參數指定欄位分隔字元,並以 `-f` 參數指定欲擷取的欄位,例如擷取出第 2 個欄位:
|
||||
|
||||
```bash
|
||||
# 擷取 CSV 檔的第二個欄位
|
||||
cut -d , -f 2 data.csv
|
||||
```
|
||||
|
||||
Output:
|
||||
```
|
||||
3.5
|
||||
3
|
||||
3.2
|
||||
3.2
|
||||
3
|
||||
```
|
||||
|
||||
若要擷取多個欄位,也是使用逗號分隔每個欄位:
|
||||
|
||||
```bash
|
||||
# 擷取 CSV 檔的第 1-3 個與第 5 個欄位
|
||||
cut -d , -f 1-3,5 data.csv
|
||||
```
|
||||
|
||||
```
|
||||
5.1,3.5,1.4,"setosa"
|
||||
4.9,3,1.4,"setosa"
|
||||
7,3.2,4.7,"versicolor"
|
||||
6.4,3.2,4.5,"versicolor"
|
||||
5.9,3,5.1,"virginica"
|
||||
```
|
||||
|
||||
Linux 中的 `/etc/passwd` 檔案內容是以冒號分隔欄位的,若要從中擷取特定的欄位,可以指定以冒號為分隔字元:
|
||||
|
||||
```bash
|
||||
# 擷取 /etc/passwd 的第 1 個與第 7 個欄位
|
||||
head -n 5 /etc/passwd | cut -d : -f 1,7
|
||||
```
|
||||
|
||||
```
|
||||
root:/bin/bash
|
||||
daemon:/usr/sbin/nologin
|
||||
bin:/usr/sbin/nologin
|
||||
sys:/usr/sbin/nologin
|
||||
sync:/bin/sync
|
||||
```
|
||||
|
||||
### 排除欄位
|
||||
|
||||
若要排除某些特定欄位,而留下其餘的欄位,同樣可以使用 `--complement` 參數:
|
||||
|
||||
```bash
|
||||
# 排除 CSV 檔的第二個欄位
|
||||
cut -d , -f 2 --complement data.csv
|
||||
```
|
||||
|
||||
```
|
||||
5.1,1.4,0.2,"setosa"
|
||||
4.9,1.4,0.2,"setosa"
|
||||
7,4.7,1.4,"versicolor"
|
||||
6.4,4.5,1.5,"versicolor"
|
||||
5.9,5.1,1.8,"virginica"
|
||||
```
|
||||
|
||||
### 輸出分隔字元
|
||||
`cut` 在輸出多欄位的資料時,預設會以輸入檔案所使用的分隔字元來分隔輸出的欄位,若要改變輸出欄位的分隔字元,可以使用 `--output-delimiter` 參數來指定:
|
||||
|
||||
```bash
|
||||
# 指定輸出欄位分隔字元
|
||||
head -n 5 /etc/passwd | cut -d : -f 1,7 --output-delimiter="^_^"
|
||||
```
|
||||
|
||||
```
|
||||
root^_^/bin/bash
|
||||
daemon^_^/usr/sbin/nologin
|
||||
bin^_^/usr/sbin/nologin
|
||||
sys^_^/usr/sbin/nologin
|
||||
sync^_^/bin/sync
|
||||
```
|
||||
|
||||
### 實用範例
|
||||
Linux 的系統管理者時常會需要使用 `ps` 指令查看各行程的狀態,但由於 `ps` 的輸出資訊很多,如果我們只想看程式的 PID 與指令內容,就可以用 `cut` 把要用的資訊擷取來:
|
||||
|
||||
```bash
|
||||
# 找出所有 Python 程式的 PID 與指令內容
|
||||
ps aux | grep python | sed 's/\s\+/ /g' | cut -d ' ' -f 2,11-
|
||||
```
|
||||
|
||||
```
|
||||
17100 grep --color=auto python
|
||||
27904 /usr/bin/python -Es /usr/sbin/tuned -l -P
|
||||
33890 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
|
||||
```
|
||||
57
00. Inbox/Linux/CLI/scp.md
Normal file
57
00. Inbox/Linux/CLI/scp.md
Normal file
@@ -0,0 +1,57 @@
|
||||
`scp` 指令的語法跟一般的 `cp` 類似,只不過 `scp` 可以在不同的 Linux 主機之間複製檔案,其語法為:
|
||||
```
|
||||
scp [帳號@來源主機]:來源檔案 [帳號@目的主機]:目的檔案
|
||||
```
|
||||
|
||||
# 保留檔案時間與權限
|
||||
若要讓檔案在複製之後,還可保留原本的修改時間、存取時間與權限,可以加上 `-p` 參數:
|
||||
```
|
||||
scp -p /path/file1 myuser@192.168.0.1:/path/file2
|
||||
```
|
||||
|
||||
# 資料壓縮
|
||||
若要將資料壓縮之後再傳送,減少網路頻寬的使用量,可以加上 `-C` 參數:
|
||||
```
|
||||
scp -C /path/file1 myuser@192.168.0.1:/path/file2
|
||||
```
|
||||
|
||||
# 限制傳輸速度
|
||||
若要限制網路的使用頻寬,可以用 `-l` 指定可用的網路頻寬上限值(單位為 Kbit/s):
|
||||
```
|
||||
# 限制傳輸速度為 400 Kbit/s
|
||||
scp -l 400 /path/file1 myuser@192.168.0.1:/path/file2
|
||||
```
|
||||
|
||||
這樣就會限制 `scp` 只能使用 `400` Kbit/s,也就是 `400 / 8 = 50` KB/s。
|
||||
|
||||
# 自訂連接埠
|
||||
一般 SSH 伺服器的連接埠號為 22,如果遇到使用非標準埠號的伺服器,可以用 `-P` 來指定埠號。若遠端的 SSH 伺服器使用 `2222` 這個連接埠,我們就可以這樣複製檔案:
|
||||
```
|
||||
# 使用 2222 連接埠
|
||||
scp -P 2222 /path/file1 myuser@192.168.0.1:/path/file2
|
||||
```
|
||||
|
||||
# IPv4 與 IPv6
|
||||
`-4` 與 `-6` 兩個參數分別可以讓 `scp` 使用 IPv4 與 IPv6 來傳輸資料:
|
||||
```
|
||||
# 使用 IPv4
|
||||
scp -4 /path/file1 myuser@192.168.0.1:/path/file2
|
||||
|
||||
# 使用 IPv6
|
||||
scp -6 /path/file1 myuser@192.168.0.1:/path/file2
|
||||
```
|
||||
|
||||
# 更快的方法:使用SSH+TAR
|
||||
```
|
||||
ssh 使用者@主機 "cd 目標目錄 ;tar -zcvf - 目標" | cat > 目標.tar.gz
|
||||
```
|
||||
|
||||
例:
|
||||
```
|
||||
ssh 192.168.0.22 "cd /var ;tar -zcvf - log" | cat > 22_log.tar.gz
|
||||
```
|
||||
|
||||
# 參考
|
||||
- [SSH + TAR 取代 SCP @ Vexed's Blog :: 隨意窩 Xuite日誌](https://blog.xuite.net/vexed/tech/586811949)
|
||||
- [Linux中互传文件:ssh+tar 与Scp 比较 - 简书](https://www.jianshu.com/p/856a2dc883e0)
|
||||
- [轉貼--ssh tar 命令把遠端檔拉回來或推過去 --- 山城風雲的點滴](http://jimsung168.blogspot.com/2014/01/ssh-tar.html)
|
||||
4
00. Inbox/Linux/CLI/systemd.md
Normal file
4
00. Inbox/Linux/CLI/systemd.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## 列出系統中的 systemd service
|
||||
```bash
|
||||
systemctl list-units --type=service
|
||||
```
|
||||
14
00. Inbox/Linux/CLI/timedatectl.md
Normal file
14
00. Inbox/Linux/CLI/timedatectl.md
Normal file
@@ -0,0 +1,14 @@
|
||||
用`timedatectl`可以看現在的時間、時區等等。也可以改變時區。
|
||||
![[Pasted image 20220516125616.png]]
|
||||
|
||||
用`timedatectl list-timezones`列出所有時區,我們已經知道我們的時區是Taipei,所以可以用grep直接把它抓出來:
|
||||
```bash
|
||||
timedatectl list-timezones | grep -i taipei
|
||||
```
|
||||
結果如下:
|
||||
![[Pasted image 20220516125742.png]]
|
||||
|
||||
設定時區:
|
||||
```
|
||||
timedatectl set-timezone Asia/Taipei
|
||||
```
|
||||
29
00. Inbox/Linux/_Map.canvas
Normal file
29
00. Inbox/Linux/_Map.canvas
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"nodes":[
|
||||
{"id":"2387a7bafd0d1fa1","type":"text","text":"Linux","x":-60,"y":-60,"width":112,"height":60},
|
||||
{"id":"480671b59b65fbee","type":"text","text":"網路","x":-260,"y":-200,"width":123,"height":60},
|
||||
{"id":"8b9a102062abf2ea","type":"text","text":"![[smb client]]","x":-660,"y":-231,"width":290,"height":123},
|
||||
{"id":"0da49f9f13cb5ea0","type":"text","text":"虛擬化","x":140,"y":-200,"width":125,"height":60},
|
||||
{"id":"67febece2a817d3a","type":"text","text":"系統管理","x":140,"y":80,"width":125,"height":60},
|
||||
{"id":"c30ec48841c09729","type":"text","text":"# LOG 管理\n[[journalctl]]","x":341,"y":80,"width":186,"height":100},
|
||||
{"id":"89e25cea38eee1c6","type":"text","text":"# 定時操作\n[[crontab]]","x":347,"y":220,"width":180,"height":100},
|
||||
{"id":"631ba79f09378fa8","type":"text","text":"![[00. Inbox/Linux/Docker|Docker]]","x":341,"y":-238,"width":250,"height":137},
|
||||
{"id":"d5901d4a7879a984","type":"text","text":"架站","x":-385,"y":-413,"width":125,"height":60},
|
||||
{"id":"5396ff224cf2433d","type":"text","text":"- [[Apache]]\n- [[Gitea]]\n- [[Grafana]]\n- [[Nextcloud]]\n- [[Pelican blog]]\n- [[Proxmox VE]]\n- [[Storj]]\n- [[filebrowser]]\n- [[freshrss]]","x":-700,"y":-480,"width":242,"height":194},
|
||||
{"id":"0211a8b636cb3542","type":"text","text":"指令操作","x":-262,"y":80,"width":125,"height":60},
|
||||
{"id":"584c8fe580aa5c65","type":"text","text":"- [[cut]]\n- [[scp]]\n- [[timedatectl]]\n- [[systemd]]","x":-620,"y":55,"width":250,"height":110}
|
||||
],
|
||||
"edges":[
|
||||
{"id":"2621855f17f1fce7","fromNode":"2387a7bafd0d1fa1","fromSide":"right","toNode":"0da49f9f13cb5ea0","toSide":"left"},
|
||||
{"id":"63fe0dc1ef02bcf0","fromNode":"2387a7bafd0d1fa1","fromSide":"right","toNode":"67febece2a817d3a","toSide":"left"},
|
||||
{"id":"8b1293fe476ce994","fromNode":"2387a7bafd0d1fa1","fromSide":"left","toNode":"480671b59b65fbee","toSide":"right"},
|
||||
{"id":"7b14c2274a6a7dce","fromNode":"480671b59b65fbee","fromSide":"left","toNode":"8b9a102062abf2ea","toSide":"right"},
|
||||
{"id":"3fb7bd17056728f2","fromNode":"0da49f9f13cb5ea0","fromSide":"right","toNode":"631ba79f09378fa8","toSide":"left"},
|
||||
{"id":"47dcc8ff2aa219d2","fromNode":"67febece2a817d3a","fromSide":"right","toNode":"c30ec48841c09729","toSide":"left"},
|
||||
{"id":"b9cbf23293526def","fromNode":"67febece2a817d3a","fromSide":"right","toNode":"89e25cea38eee1c6","toSide":"left"},
|
||||
{"id":"305a94a3648fc58b","fromNode":"d5901d4a7879a984","fromSide":"left","toNode":"5396ff224cf2433d","toSide":"right"},
|
||||
{"id":"1007d8512d956cdb","fromNode":"480671b59b65fbee","fromSide":"left","toNode":"d5901d4a7879a984","toSide":"right"},
|
||||
{"id":"c6875871d1de0864","fromNode":"2387a7bafd0d1fa1","fromSide":"left","toNode":"0211a8b636cb3542","toSide":"right"},
|
||||
{"id":"40f0ca450747f830","fromNode":"0211a8b636cb3542","fromSide":"left","toNode":"584c8fe580aa5c65","toSide":"right"}
|
||||
]
|
||||
}
|
||||
52
00. Inbox/Linux/架站/filebrowser.md
Normal file
52
00. Inbox/Linux/架站/filebrowser.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# docker-compose.yml
|
||||
```yml
|
||||
version: '3'
|
||||
services:
|
||||
file-browser:
|
||||
restart: always
|
||||
image: filebrowser/filebrowser:latest
|
||||
container_name: filebrowser
|
||||
user: 1000:1000
|
||||
ports:
|
||||
- 8040:80
|
||||
volumes:
|
||||
- /media/share:/srv
|
||||
- ./data/filebrowser.db:/database.db
|
||||
- ./data/settings.json:/.filebrowser.json
|
||||
- ./data/gafiled.png:/config/logo.png
|
||||
- ./data/branding:/branding
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
```
|
||||
|
||||
# 準備
|
||||
在 `docker compose up -d` 之前,需要先把檔案準備好。
|
||||
```shell
|
||||
touch data/filebrowser.db
|
||||
touch data/settings.json
|
||||
```
|
||||
|
||||
`data/settings.json` 的內容:
|
||||
```json
|
||||
{
|
||||
"port": 80,
|
||||
"baseURL": "",
|
||||
"address": "",
|
||||
"log": "stdout",
|
||||
"database": "/database.db",
|
||||
"root": "/srv"
|
||||
}
|
||||
```
|
||||
|
||||
# 登入
|
||||
預設的帳號密碼是`admin/admin`,記得要改掉。
|
||||
|
||||
# 問題
|
||||
因為Filebrowser會lock DB,所以docker在跑得時候會無法使用Filebrowser的command,所以需要先把docker停掉,然後用以下命令登入:
|
||||
```shell
|
||||
sudo docker run -it -v ./data/filebrowser.db:/database.db -v data/settings.json:/.filebrowser.json --entrypoint /bin/sh filebrowser/filebrowser
|
||||
```
|
||||
|
||||
# 參考
|
||||
- [Filebrowser Docker Installation | All about](https://bobcares.com/blog/filebrowser-installation-in-docker/)
|
||||
- [filebrowser/filebrowser: 📂 Web File Browser](https://github.com/filebrowser/filebrowser)
|
||||
26
00. Inbox/Linux/架站/freshrss.md
Normal file
26
00. Inbox/Linux/架站/freshrss.md
Normal file
@@ -0,0 +1,26 @@
|
||||
```yml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
freshrss:
|
||||
image: linuxserver/Taipei:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:80"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
CRON_MIN: "*/60"
|
||||
PUID: 1000
|
||||
PGID: 1000
|
||||
volumes:
|
||||
- freshrss_data:/var/www/FreshRSS/data
|
||||
- freshrss_extensions:/var/www/FreshRSS/extensions
|
||||
|
||||
rsshub:
|
||||
image: diygod/rsshub:latest
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "1200"
|
||||
environment:
|
||||
CACHE_EXPIRE: 3600
|
||||
```
|
||||
Reference in New Issue
Block a user