Linux shell命令使用案例小結

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 命令

  1. 查看端口
  2. 聊天服務器
  3. 發送文件

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用法

  1. -u 去除重複行
  2. -r 降序
  3. -o 結果輸出文件
  4. -n/-g 按數字排序
  5. -t 設置間隔符
  6. -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。

  1. 無選項編譯鏈接
    用法:#gcc test.c
    作用:將test.c預處理、彙編、編譯並鏈接形成可執行文件。這裏未指定輸出文件,默認輸出爲a.out。

  2. 選項 -o
    用法:#gcc test.c -o test
    作用:將test.c預處理、彙編、編譯並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。

  3. 選項 -E
    用法:#gcc -E test.c -o test.i
    作用:將test.c預處理輸出test.i文件。

  4. 選項 -S
    用法:#gcc -S test.i
    作用:將預處理輸出文件test.i彙編成test.s文件。

  5. 選項 -c
    用法:#gcc -c test.s
    作用:將彙編輸出文件test.s編譯輸出test.o文件。

  6. 無選項鍊接
    用法:#gcc test.o -o test
    作用:將編譯輸出文件test.o鏈接成最終可執行文件test。

  7. 選項-O
    用法:#gcc -O1 test.c -o test
    作用:使用編譯優化級別1編譯程序。級別爲1~3,級別越大優化效果越好,但編譯時間越長

61.恢復刪除文件

  1. 參考博客
  2. df <目錄名>
  3. 進入debugfs中執行open <df中file system>
  4. 執行ls -d /opt/fonsview/etc/ss
  5. 在顯示結果中查找<>,找到刪除的文件,記錄之前的 <數字>
  6. 執行 logdump -i <數字>
  7. 在結果中找到Inode這一行,找到block 和offset 記錄數字
  8. 退出debugfs,exit
  9. 執行 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
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章