1. 獲取目錄名或文件名
# 列出當前目錄,所有目錄名,沒有目錄會報錯
ls -d */ | xargs basename -a
# 列出當前目錄及子目錄所有文件, f是文件,可以改爲d,列出目錄
find . -type f -print
2. 清空文件內容
cat /dev/null > tmp.txt
# 等價於
:> tmp.txt
# 使用填充文件
dd if=/dev/zero of=~/zero bs=1K count=12
3. 備份數據
cp test.{txt,txt.bak}
4. 笛卡爾積
# 使用大括號生成file1:A file1:B file1:C file2:A file2:B file2:C file3:A file3:B file3:C
echo {file1,file2,file3}:{A,B,C}
5. 時間格式化
# Y:年,m:月,d:日,H:24小時制,I:12小時制,M:分,S:秒
date +%Y-%m-%d
# u:星期1-7,w:星期0-6, 0代表星期日
6. 文件某行添加內容
sed -i "17i content" file.txt
7. 獲取端口進程情況
netstat -tunlp |grep <端口號>
ps aux | head -1;ps aux | grep <進程名字>
8. 命令輸出丟掉
# &>/dev/null 等價於 >/dev/null 2>&1
ls &>/dev/null
9. 文件或目錄是否存在,不存在則創建
[ -d <目錄名> ] || mkdir <目錄名>
[ -f <文件名> ] || touch <文件名>
10. 在腳本中,使用sudo自動輸入root賬戶密碼
echo "<root/password>"|sudo -S <code/want/to/run>
11. 在awk, sed中使用外部變量
# awk或者sed 引入外部變量 "'$var'" ,變量有空格"'"$var"'"
NICS=`echo $line | awk '{printf $1"'$SEP'"$2"'$SEP'"; for(i=3;i<NF;i++) printf $i" "; printf $NF"\n"}'`
12. 判斷linux版本
# 查看centos版本
cat /etc/redhat-release
# 查看ubuntu版本
cat /etc/issue
13. 讀取鍵盤輸入
# -t 時間不超過秒數, -n 輸入字符不超過 -p 提示字符串
read -t 10 -n 3 -p "please input your name:" name
14. 比較兩個文件差異性
cmp file1 file2
15. 創建時寫入文件
cat>mail-list<<-EOF
文件內容
文件內容
...
EOF
16. 讀取文件行
for line in `cat 文件`
do
echo $line
...
done
while read line
do
echo $line
done < 文件
cat 文件 | while read line
do
echo $line
done
17. grep 完全匹配
grep -x bash
18. find 查找區分大小的文件
find . -size 14k # 查找當前目錄下及子目錄下大小等於14k的文件
find . -size -14k # 小於14k文件
find . -size +14k # 大於14k文件
19. 統計輸出行數
ls -l | wc -l
20. 獲取輸出前幾行或後幾行
ls -l | head -2 # 前兩行
ls -l | tail -2 # 後兩行
21. <<<的用法
grep 123 <<< 345123
# 類似於
echo 345123 | grep 123
# <<< 用於將後面的內容作爲前面的標準輸入
22. shell打印字體顏色
# 夾在 "\e["和 "m"之間的數字
# 如果指定一個以上的數字,則用分號將它們分開
# 例如:"\e[31;42m"
# 第一個數字(31)爲前景顏色(紅色);第二個數字爲(42)背景顏色(綠色)
# 通過\e[0m設爲正常值
#
顏色 | 字背景顏色代碼 | 字顏色代碼 |
---|---|---|
黑 | 40 | 30 |
紅 | 41 | 31 |
綠 | 42 | 32 |
黃 | 43 | 33 |
藍 | 44 | 34 |
紫 | 45 | 35 |
青 | 46 | 36 |
白 | 47 | 37 |
代碼 | 效果 |
---|---|
\033[0m | 關閉所有屬性 |
\033[1m | 設置高亮度 |
\033[4m | 下劃線 |
\033[5m | 閃爍 |
\033[7m | 反顯 |
\033[8m | 消隱 |
\033[30m – \033[37m | 設置前景色,見上面的表格 |
\033[40m – \033[47m | 設置背景色,見上面的表格 |
\033[nA | 光標上移n行 |
\033[nB | 光標下移n行 |
\033[nC | 光標右移n行 |
\033[nD | 光標左移n行 |
\033[y;xH | 設置光標位置 |
\033[2J | 清屏 |
\033[K | 清除從光標到行尾的內容 |
\033[s | 保存光標位置 |
\033[u | 恢復光標位置 |
\033[?25l | 隱藏光標 |
\033[?25h | 顯示光標 |
23.判斷一個命令是否存在
# 1. 使用which,據網絡查找,有缺點:這是非shell內置命令,不同環境實現不同,使用$?判斷可能失敗
which wget
# 2. 使用command
command wget -h &> /dev/null
24.替換目錄下所有文件中匹配的字符串
sed -iz 's/http:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/1.0.8\/angular.min.js/https:\/\/cdn.bootcss.com\/angular.js\/1.0.8\/angular.min.js/' `find . -type f -print0`
25.tar.xz文件解壓到指定目錄
# x 從壓縮文件提取文件
# v 顯示正在處理的文件
# J 可以處理 xz,lzip,lzma,
# f 使用文件
tar xvJf cron-4.1-65.tar.xz -C /
26.crontab定時任務
# 分 時 日 月 周 命令
# [0-59] [0-23] [1-31] [1-12] [0-6]
* * * * * * date "+%Y-%m-%d %H:%M:%S"
27.tput 終端處理
28.Linux 錄製和回放
# 開始錄製
script -t 2>time.file -a output.file
...
# 結束錄製
# 開始回放
scriptreplay time.file output.file
29.查看文件創建時間(Windows cygwin)
# linux不能查看,會輸出-
stat -c %w tmp.sh
30.將文本文件每行逆序輸出
rev file
31.find多文件 使用*要使用""包起來
32.獲取腳本執行所在目錄
$(cd `dirname $0`; pwd)
33.umask
umask
# 0022
# setUid/setGid/粘着位(sticky)、屬主權限、組權限、其他用戶的權限
# 通常用後三個
# 文件夾默認權限777,需要減掉022得到755
# 文件默認權限666,減掉022得到644
34.使用上條命令或參數
# 第一個參數
!:1
# 最後一個參數
!:$
# 上一條命令 不包括參數
!:0
# 或者
!#
!s以前用過的以s開頭的命令,包括參數
!! 上一條命令,包括參數
35.計劃任務
-
一次性任務
at now + 5 minutes 任務在5分鐘後運行 at now + 1 hour 任務在1小時後運行 at now + 3 days 任務在3天后運行 at now + 2 weeks 任務在兩週後運行 at midnight 任務在午夜運行 at 10:30pm 任務在晚上10點30分 at 23:59 12/31/2018 任務在2018年12月31號23點59分 echo "wget www.baidu.com" | at tomorrow atq # 查看at任務列表,等價於at -l atrm 1 # 刪除at中id爲1的任務,等價於at -d 1
-
長期性任務,見26
crontab -e # 添加 crontab -l # 查看
36.添加刪除用戶、組
useradd zhangsan
adduser zhangsan # 會在home目錄下建立一個同名文件夾,等價於useradd -m
userdel zhangsan
deluser zhangsan
groupadd QQgroup
addgroup QQgroup
groupdel QQgroup
delgroup QQgroup
gpasswd -a zhangsan QQgroup
gpasswd -d zhangsan QQgroup
37.給特定用戶或用戶組添加權限
# 加R可以設置目錄
# 設置文件的用戶或用戶組的ACL權限
setfacl -m u:用戶名:權限 文件名
setfacl -m g:用戶組名:權限 文件名
# 刪除文件指定用戶或用戶組的ACL權限
setfacl -x u:用戶名 文件名
setfacl -x g:組名 文件名
# 刪除文件所有ACL權限
setfacl -b 文件名
# 查看ACL權限
getfacl 文件名
38.獲取本機外網地址
curl ifconfig.me
39.修改ubuntu主機名
修改/etc/hostname文件,將/etc/hosts加入一條
127.0.0.1 [修改後的主機名]
不加的話會在重啓後一直出現unable to resolve host,然後reboot
40.iptables 用法
參考鏈接 https://www.cnblogs.com/metoy/p/4320813.html
41.echo 獲取幫助文檔
/bin/echo --help
man echo
42.nc 命令
- 查看端口
- 聊天服務器
- 發送文件
43.tshark.exe在windows下使用
要先用管理員身份啓動net start npf,接着就可以使用tshark了
44.將製表符轉化爲空格
expand -t 10 file
45.查看某一個進程的實時CPU利用率
top -p `ps aux | grep -w mysql | grep -v grep | awk '{print $2}'`
46.Shell開啓調試
#!/bin/bash -x
47.Shell異常退出
set -e #開啓後任意一條語句返回值不爲真就退出
set +e #關閉
48.markdownpad2寫行內公式
\\(a+b\\)
49.stty size
50.sort用法
- -u 去除重複行
- -r 降序
- -o 結果輸出文件
- -n/-g 按數字排序
- -t 設置間隔符
- -k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
# 由逗號隔開,分爲start和end兩部分 # modifier是選項部分,如b忽略前導空白、d字典序、f忽略大小寫、i忽略不可打印字符、n 或 r # FStart 表示第開始排序的field位置,FEnd 表示結束field位置 從1開始 # CStart 表示第開始排序的char位置,CEnd 表示結束char位置 sort -t ":" -k1.2n,1.2
51.命令行ctrl組合快捷鍵
# 清屏
clear
# 分別代表把管標移動到最前和最後
# echo -e '\00X' 或者 echo $'\00X' X是十進制數 ctrl+A echo -e '\001'
快捷鍵 | 效果 |
---|---|
ctrl+a | 光標移到行首 |
ctrl+b | 光標左移一個字母, 向行首移動一個字符 |
ctrl+c | 殺死當前進程 |
ctrl+d | 刪除光標之後的一個字符 |
ctrl+e | 光標移到行尾 |
ctrl+f | 光標右移,向行尾移動一個字符 |
ctrl+g | 從逆向搜索模式退出 |
ctrl+h | 刪除光標前一個字符,同 backspace 鍵相同 |
ctrl+i | 類似TAB健補全功能 |
ctrl+j | 回車,相當於enter |
ctrl+k | 刪除光標所在位置之後的所有字符 |
ctrl+l | 清屏,相當於clear |
ctrl+m | 回車,相當於enter |
ctrl+n | 歷史命令下一條命令,可用來查找 |
ctrl+o | 回車,相當於enter |
ctrl+p | 歷史命令上一條命令,可用來查找 |
ctrl+q | 解鎖屏幕,允許屏幕輸出 |
ctrl+r | 進入逆向搜索模式,搜索之前執行的命令 |
ctrl+s | 鎖定屏幕,阻止屏幕輸出 |
ctrl+t | 交換光標位置前的兩個字符 |
ctrl+u | 清除光標前至行首間的所有內容 |
ctrl+v | 插入特殊字符,如在命令行輸入tab ctrl+v tab |
ctrl+w | 移除光標前的一個單詞 |
ctrl+x | |
ctrl+y | 粘貼或者恢復上次的刪除 |
ctrl+z | 把當前進程轉到後臺運行,使用fg命令恢復。比如top然後ctrl+z,到後臺,然後fg,重新恢復 |
52.cp出現提示
使用-rf無效還是出現覆蓋提示,原因是使用了alias, cp實際爲cp -i
\cp -rf test/* test1/
53.添加用戶進sudo組
vim /etc/sudoers
# 或
sudo visudo
# 文件最後一行添加,這種情況下需要用戶輸密碼
robin ALL=(ALL) ALL
# 如果不需要用戶輸密碼
robin ALL=(ALL) NOPASSWD:ALL
54.接收信號,自定義信號處理
trap "echo '接收到信號SIGINT CTRL+C'" SIGINT
count=1
while [ $count -le 10 ]
do
echo "循環 #$count"
sleep 1
((count++))
done
echo "結束"
55.複製一份文件n份
for((i=1;i<=16;i++)) do cp <文件名> <複製後文件名>$i; done
56.unzip解壓強制覆蓋
unzip -o file.zip
57.ssh遠程登錄
# 兩臺主機
# 服務器:10.110.50.110 root
# 客戶機: 10.110.50.240 ubuntu
# 先在客戶機使用ubuntu登錄,調用ssh-keygen,一路回車,在/home/ubuntu/.ssh下生成公鑰id_rsa.pub和私鑰id_rsa
ssh-keygen
# 再把id_rsa.pub上傳到服務器上,添加到/root/.ssh/authorized_keys文件中,然後可以刪除這個id_rsa.pub
cat id_rsa.pub >> authorized_keys
# 最後在客戶機/home/ubuntu/.ssh下,使用ssh -i id_rsa [email protected]就可以免密碼登錄服務端了
# 原理
# 當客戶機向服務器發出建立安全連接的請求時,首先發送自己的public key,如果這個public key是被服務器所允許的,
# 服務器就發送一個經過public key加密的隨機數據給客戶機,這個數據只能通過private key解密,
# 客戶機將解密後的信息發還給服務器,服務器驗證正確後即確認客戶機是可信任的,從而建立起一條安全的信息通道
58.shell公共函數與自定義函數庫
# 公共函數庫位置
/etc/init.d/functions
# 也可以自定義自己的函數庫
# 然後在自己調用函數庫的執行一下
. /etc/rc.d/init.d/functions
# 或者
. /path/to/my/function/lib
# 就能調用函數庫腳本中的函數了
59.將大寫文件名轉成小寫
find . | awk '{low=tolower($1);cmd="mv "$1" "low;system(cmd)}'
60.單文件gcc編譯
假設源程序文件名爲test.c。
-
無選項編譯鏈接
用法:#gcc test.c
作用:將test.c預處理、彙編、編譯並鏈接形成可執行文件。這裏未指定輸出文件,默認輸出爲a.out。 -
選項 -o
用法:#gcc test.c -o test
作用:將test.c預處理、彙編、編譯並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。 -
選項 -E
用法:#gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i文件。 -
選項 -S
用法:#gcc -S test.i
作用:將預處理輸出文件test.i彙編成test.s文件。 -
選項 -c
用法:#gcc -c test.s
作用:將彙編輸出文件test.s編譯輸出test.o文件。 -
無選項鍊接
用法:#gcc test.o -o test
作用:將編譯輸出文件test.o鏈接成最終可執行文件test。 -
選項-O
用法:#gcc -O1 test.c -o test
作用:使用編譯優化級別1編譯程序。級別爲1~3,級別越大優化效果越好,但編譯時間越長
61.恢復刪除文件
- 參考博客
- df <目錄名>
- 進入debugfs中執行open <df中file system>
- 執行ls -d /opt/fonsview/etc/ss
- 在顯示結果中查找<>,找到刪除的文件,記錄之前的 <數字>
- 執行 logdump -i <數字>
- 在結果中找到Inode這一行,找到block 和offset 記錄數字
- 退出debugfs,exit
- 執行 df if=文件系統 of=文件路徑 bs=offset數字 count=1 skip=block數字
62.判斷jar包是否損壞
unzip -t test.jar &> /dev/null
echo $?
63.字符串數組轉命令
checkCammand="cat /sys/module/nf_conntrack/parameters/hashsize,\
cat /proc/sys/net/ipv4/tcp_tw_recycle,\
cat /etc/sysctl.conf |grep tcp_tw_recycle"
OLD_IFS=$IFS
IFS=","
checkCammandArray=($checkCammand)
IFS=$OLD_IFS
for((i=0;i<${#checkCammandArray[@]};i++))
do
eval ${checkCammandArray[i]}
done
64.斜槓替換,將\替換爲/
path=Users\root\Desktop\Card-Upgrade\card-upgrade-src\card-upgrade-server\src\main\java\com\fiberhome\synergy\upgrade\entity
echo ${path//\\//}
65.刪除每行前兩個數字和製表符
sed -i 's/[0-9]\{2\}\t' num.txt
66.查看進程中線程CPU利用率
top -Hp <進程id>
67.進制轉換
# 10進制轉16進制
printf %x 789
echo "obase=16;ibase=10;789" | bc
# 16進制轉10進制
printf %d 0x315
echo "obase=10;ibase=16;315" | bc
echo $((0x315))
echo $((16#315))
68.複製多個目錄下avi視頻文件到上層目錄
cp */*.avi .
69.jstack生成文件查看線程狀態種類及數量
grep java.lang.Thread.State 6780.txt | awk '{print $2$3$4$5}' |sort | uniq -c
awk '/java.lang.Thread.State/ {print $2$3$4$5}' app.txt | sort |uniq -c