天天看點

shell腳本常用指令與方法總結

工作中shell腳本,經常用的文法,整理了下

1 echo帶色的 列印字元串帶色(31紅色,32綠色,33黃色,34藍色)

列印字元串背景帶色 (40黑色,41紅色,42綠色,黃色43,藍色44,白色47)

echo -e “\e[31;43m Hello Word\n Hello word \e[0m”

echo -e “\e[31;43m Hello Word\n Hello word \e[0m”

export PS1="[\e[31;40m\u\e[0m \e[32;40m@\h\e[0m \e[33;40m\W\e[0m] " 2 添 加 常 用 目 錄 為 " 2 添加常用目錄為 "2添加常用目錄為PATH的查找目錄

PATH="$PATH:/home/gongzuo/"

export PATH

3 擷取變量的長度

echo ${#HOME}

4 修改系統中的一些常用變量(如PS1)對所有使用者永遠生效

vim /etc/profile

PS1=“[email protected]”

[email protected]_dd#source /etc/profile

5 算術運算

(1)echo $[ 3 + 2 ]

echo $(( 3 + 2 ))

(2)[email protected]>let a=4+3;echo $a

[email protected]>a=1;let a+=6;echo KaTeX parse error: Expected 'EOF', got '#' at position 58: …=2;13/8"|bc #̲##scale設定精确到極為小…a"|bc #####進制轉化

6 列印資訊分類

cat a.* 2>err.log 1>stbout.log ###标準輸出重定向到stbout.log,标準錯誤重定向到err.log

7 數組

a=(1 2 3)

echo ${a[]}

echo ${a[2]}

echo ${a[1]}

8 顯示時間格式

date “+%Y %B %d”

date +%s #列印紀元時

9 腳本參數

$@ 一次性列印所有參數,作為一個實體

$ 一次性列印所有參數,單個參數作為一個實體

$? 檢測是否執行成功,成功列印0

$# 總計幾個參數

10 函數格式

function test()

{

echo “test test”

}

test

11 read

(1)read -p “plesase input number” a

echo $a

(2)read -n 5 a #輸入5個字元自動結束

echo KaTeX parse error: Expected 'EOF', got '#' at position 87: …me test.sh #̲從目前目錄向下查2級目錄 f…count

echo “Rename $i to $new”

mv $i $new

let count++

done

17 dd指令(測試磁盤性能,備份資料,清除資料,寫固定檔案)

dd if=/dev/zero of=test.file bs=1M count=1

18 comm 對比兩檔案中字元的差異(預設輸出3塊,第一塊是a中有的,第二是b中有的,第三是ab都有的)

comm a b

comm a b -1 -2 #删掉ab不同的字元,輸出ab相同的字元

comm a b -3 |sed ‘s/^\t//g’ #輸出ab不同的字元,sed屏蔽字元前的空格

19 環回檔案系統 :指把一個檔案格式檔案系統後,挂載後使用(非實體硬體)

20 wc指令

cat file |wc -l #統計行數

cat file |wc -w #統計單詞數

21 正則

^起始 KaTeX parse error: Can't use function '\.' in math mode at position 217: … -n "[0-9]{1,3}\̲.̲[0-9]{1,3}\.[0-…/d’ file #移除空白行

sed ‘s/aa/&BB/’ file #&表示之前比對到的字元。

25 awk

awk ‘BEGIN { print “start”} {print } END{print “end”}’

awk -F “:” ‘{ print $2 }’ #定界符

26 dhclient em1 動态通過dhcp擷取ip位址

ifconfig |cut -c-10|tr -d ’ ’ |tr -s ‘\n’ #列印前10個字元,tr -d删除每行空格,tr -s 壓縮空格行

route add default gw 1.1.1.1 em1

ping -c 2 #-c嘗試2次

27 ssh

ssh [email protected] ‘command’ #直接傳指令向遠端伺服器

ssh [email protected] -p 422

28 lsof

lsof -i:8080

lsof -i

29 套接字

nc -l 1234 #監聽伺服器

nc host—ip 1234 #連接配接端

30 time

time sh a.sh #記錄a.sh執行完的時間

31 last 列出上一次啟動使用者登入的資訊

lastb 登入失敗的資訊

32 watch ‘ls -l’ #監控這個目錄的檔案,

33 logrotate 将日志檔案輪詢限制在一定的大小裡。

34 ps -eo pcpu,pid, #e是every o是制定輸出的列

ps -eo comm,pid,pcpu --sort -pcpu|head -n 20 #sort對輸出的列排序,+—— 是排序方式。

  pgrep httpd #列印程序号

35 kill

pkill httpd #按程序名字kill

36 top

top -Hp $pid -bn1|grep daemgr|awk ‘{print $(NF), 1 , ( N F − 3 ) , 1,(NF-3), 1,(NF−3),(NF-2)}’ #實時提取top中 p i d 該 進 程 的 c o m m a n d , p i d , c p u 37 在 s h e l l 中 執 行 s q l 語 句 ( 1 ) m y s q l − − u s e r = r o o t − − p a s s w o r d = pid該程序的command,pid,cpu%,mem% 37 在shell中執行sql語句 (1)mysql --user=root --password= pid該程序的command,pid,cpu37在shell中執行sql語句(1)mysql−−user=root−−password=passwd --database=bds -e "select * from sample limit 10 "

(2)echo “select count() from sample"|mysql -uroot -p p a s s w d − − d a t a b a s e = b d s ( 3 ) m y s q l 正 則 的 用 法 m y s q l − u r o o t − p passwd --database=bds (3)mysql正則的用法 mysql -uroot -p passwd−−database=bds(3)mysql正則的用法mysql−uroot−ppasswd --database=bds -e "select * from sample where sample_name REGEXP '[fav]orm’”;

select sample_name from sample where sample_name like ‘%ac%’;

38 mysql基本文法

1delete: DELETE FROM runoob_tbl WHERE sample_id=3;

2update: UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

update tcphdr set sid=3 where cid=‘39’;

3insert:insert into samples values (‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’); #新增加一行,按列的多少和類型填入

4alert:alter table aaa add age char; #新添加一列

5 create database cyd;

6 create TABLE CHEN (ID INT, NAMN CHAR, TIME DATE);

7 select max(id) as max_id from aaa; #函數用法

8 select * from aaa where name in (‘A’,‘B’); #取出name是AB的行

9 select SUM(id) as sum from aaa;

10 select id from aaa order by id;

11 select id from aaa order by id desc; #逆序排序

12 select name,sum(sale) as total from aaa group by name; #按名字排序消費總和

13 ELECT ns_app_ptl,count(ns_app_ptl) as count FROM network_session GROUP BY ns_app_ptl ORDER BY count asc limit 10;

order by count asc 從小到大排序

order by count desc 從conut列的大到小排序

GROUP BY ns_app_ptl 按ns_app_pt1列中的類型統計計數。

39 tcpdump

tcpdump -i em4 dst port 25 or src port 25

40 tcpreplay

tcpreplay -i em2 smtp.pcap03 (em2和em3環起來,在em2回放,em3上去監聽)

41 tar的打包與解包

(1)打包:tar -z(j)cvf xxx.tar.gz /root/kaifa/*

(2)解包:tar -zxvf xxx.tar.gz

#####z表示有gzip屬性,j表示有bzip2屬性。c是create打包 v列出詳情,r是追加(向已經有的壓縮檔案中加檔案)f檔案的名字(這個名字是自己定義的) + 打包的檔案or目錄

(3) rar 壓縮rar xx.rar .jpg

解包unrar e xx.rar

(4) zip 壓縮 zip xx.zip /home/kaifa/

解包 unzip xx.zip

42 route (U 是路由,GU是網關)

route按主機名稱列出來

route add default gw 192.168.1.2

route -n 按網絡位址列出來

route add -net 10.11.1.0/8 gw 192.168.3.1 dev em1 添加路由

route add -net 172.168.1.0 netmask 255.255.0.0 reject 添加拒絕路由

route del -net 10.0.0.0 netmask 255.0.0.0 reject 删除拒絕路由

43 img轉成qcow2

qemu-img convert -f raw centos.img -O qcow2 centos.qcow

44.exce和xargs

[[email protected] cyd]# find ./ -type f|xargs ls -l

[[email protected] cyd]# find ./ -type f -exec ls -l {} ;

ps -ef | grep suricata |grep -v grep| awk ‘{print $2}’ | xargs -i kill {}

45 列印出16進制的

附:執行個體

#掃描區域網路中存活的主機個數

#!/bin/bash
    #file-name:ip_scan.sh
    for ip in 192.168.9.{1..254};
    do 
       
       ping $ip -c 2  2>&1 >/dev/null
      if [ $? == 0 ]
      then 
      echo $ip >>alive.txt   #存活的主機寫入alive檔案
      else 
      echo $ip >>error.txt  #不存活的自己寫入error檔案
     fi
     done