About

Work - Learn - Share

Lê Quang Thành : quangthanh010290@gmail.com | thanhlev@amazon.com.vn

Linux general

Items Details
Shell count number of lines
ps -A|wc -l # count all processes
ps -LA|wc -l # count all threads
ps aux|awk '{print $11}'|grep "^\["|wc -l # count all kernel threads
Auto mount SSD at bootup
Get the uuid of SSD
sudo blkid
ls -al /dev/disk/by-uuid/
Edit the file /etc/fstab
UUID=b071688a-414a-4665-a45e-102432e06315 /media/thanh/ssd      ext4    defaults        0       0
Test the fstab file
findmnt --verify
Virtual Display
Create /etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "intelgpu0"
  Driver "intel"
  Option "VirtualHeads" "1"
EndSection
Generate modeline with or cvt
cvt 1920 1080
xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
xrandr --addmode VIRTUAL1 1920x1080_60.00
Activate virtual display: (Replace HDMI1 with your real display)
xrandr --output VIRTUAL1 --mode 1920x1080_60.00 --right-of HDMI1
Edit pushed commits
git rebase -i HEAD~N # N là số commit muốn chỉnh sữa tính từ commit gần đây nhât. 
Edit commit
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
Force push update
git push --force
Network Manager skip managing device
# file: /etc/NetworkManager/NetworkManager.conf
# filter by name
[keyfile]
unmanaged-devices=interface-name:interface_1;interface-name:interface_2

# fileter by mac
[keyfile]
unmanaged-devices=mac:00:11:22:33:44:55;mac:66:77:88:99:00:aa
Calculation
val=$(expr "$val" + 256)
Cleanup Disk
# Clear systemd journal logs
sudo journalctl --vacuum-time=3d # clear log older 3 days
# Clean snap
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
while read snapname revision; do
    snap remove "$snapname" --revision="$revision"
done
# remove old kernel
sudo apt-get remove --purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')
Set timezone
# get timezone name
timedatectl list-timezones | grep "Ho"
# set timezone
timedatectl set-timezone Asia/Ho_Chi_Minh
Update hardware clock time
# read the Hardware Clock
hwclock -r or hwclock --show or hwclock --show --verbose
or hwclock --show --utc

# set data and time
date -s "Fri Mar  3 04:10:53 PM +07 2023" # giá trị lấy từ date command

# Set the Hardware Clock to the current System Time
hwclock --systohc or hwclock -w
Các biến script đặc biệt
- $0: tên file script đang chạy
- $#: tổng số tham số truyền vào ( = 0 nếu không truyền tham số nào)
- $*: for val in $*; do echo "val: $val"; done : dồn các biến thành 1 biến
- $@: for val in $@; do echo "val: $val"; done : là array của các biến 
có thể truy cập bằng index - ${@:2}: lấy từ index thứ 2 cho đến hết
Natural sort
apt install python3-natsort
docker ps | awk '{print $NF}' | natsort

sed

Items Details
Replace sub string
a="\"$1\""
sed -i -e "s/\(ssid=\).*/\1$a/" /etc/wpa_supplicant/wpa_supplicant.conf
remove a line
sed -i /${filter}/d ${FILE}

awk

Items Details
Print Specific Field
# sử dụng ký tự `:` làm ký tự  phân chia và in cột đầu tiên
awk -F':' '{ print $1 }' /etc/passwd

# In cột cuối cùng
docker ps | grep my-name | awk {'print $NF'}
Pattern Matching
# In ra dòng nào trong file access.log có mã lỗi 500(mã lỗi xuất hiện ở cột thứ 9)
awk '$9 == 500 { print $0}' access.log

# Cách cách sử dụng khác nhau
awk '$9 == 500 ' /var/log/httpd/access.log # không có action, mặc định in toàn bộ dòng nào khớp
awk '$9 == 500 {print} ' /var/log/httpd/access.log # không chỉ định in field nào, in hết
awk '$9 == 500 {print $0} ' /var/log/httpd/access.log # $0 tương đương in hết.

# In dòng nào có chứa string mèo , chuột và chó.
awk '/mèo|chuột|chó/' /etc/passwd

# In dòng đầu tiên của file
awk "NR==1{print;exit}" /etc/resolv.conf
awk "NR==$line{print;exit}" /etc/resolv.conf
Tính toán đơn giản
# Tính tổng các số trong 1 cột
awk '{total += $1} END {print total}' earnings.txt

# shell không thể tính toán số thực, nhưng awk có thể.
awk 'BEGIN {printf "%.3f\n", 2005.50 / 3}'
Use pattern file
# nội dung file wlan_scan.awk
/^BSS/ {
    mac = gensub ( /^BSS[[:space:]]*([0-9a-fA-F:]+).*?$/, "\\1", "g", $0 );
}
/^[[:space:]]*signal:/ {
    signal = gensub ( /^[[:space:]]*signal:[[:space:]]*(\-?[0-9.]+).*?$/, "\\1", "g", $0 );
}
/^[[:space:]]*freq:/ {
    freq = gensub ( /^[[:space:]]*freq:[[:space:]]*(\-?[0-9.]+).*?$/, "\\1", "g", $0 );
}
/^[[:space:]]*SSID:/ {
    ssid = gensub ( /^[[:space:]]*SSID:[[:space:]]*([^\n]*).*?$/, "\\1", "g", $0 );
    printf ( "%s %s %s\n", signal, mac, ssid );

# Sử dụng
sudo iw wlan0 scan | awk -f wlan_scan.awk  | sort -gr