linux shell 總結 (整理)

ls /usr/bin/

info
#路徑操做
dirname
basename
#「」和‘’與 ` ` 在shell變量中的區別      
「 」 容許經過$符引用其餘變量
‘’禁止引用其餘變量符,視爲普通字符
`` 將命令執行的結果輸出給變量
 
#執行一個命令,但不保存在命令歷史記錄中
<space>command
man ascii
 
#並行執行的命令之間添加&,多條命令就能夠並行執行。
ls & echo 'aaaaaaaa' & echo 'fesfsfse'
#串行執行命令「&&」。若是要查看一個程序所執行的時間,可使用命令date&&./須要執行的程序&&date來查看
#shell1 && shell2 ,若是是用&&符鏈接的,那只有在shell1返回0(即正常)時,shell2纔會執行,不然shell2根本就不執行,因此前面說得最後一種cd&&rm的這種作法是可行的,並且是安全的。那||呢,對於shell1||shell2,只有在shell1執行失敗時,shell2纔會執行,不然shell2是不執行得
經常使用的 for 循環{
#for循環
a="a b c d e f"
for x in $a; do  echo $x+'q'; done
for x in {1..9}; do  echo $x; done
for x in `seq 30`; do echo $x; done
select a in 1 2 3 4 5 6 7; do echo $a; done #建立選擇菜單,無限循環
sh -v install.sh #查看執行的代碼
sh -n install.sh #語法檢查,沒有錯誤不顯示內容
f=/home/config.ini
while read -r b; do echo $b+'dada'; done < "$f" #一行一行讀取文件
while read b; do echo $b+'dada'; done < $f
while read b; do echo "your input is $b"; done #讀入鍵入的內容
cat 1.txt |while read line; do echo $line; done #讀取文件
for x in `cat 1.txt`; do echo $x; done #按空格和回車讀取文件
}
done & #後臺執行循環
echo $SHELL  #查看當前環境所使用的shell解釋器
#腳本通常第一行爲:#!/bin/bash
chsh -l #查看系統支持哪些shell解釋器



whereis ls # 查找命令的目錄
which # 查看當前要執行的命令所在的路徑
echo -n 123456 | md5sum # md5加密
vi /etc/hosts # 查詢靜態主機名
alias # 別名
vmstat 1 9 # 每隔一秒報告系統性能信息9次
ps aux |grep -v USER | sort -nk +4 | tail # 顯示消耗內存最多的10個運行中的進程,之內存使用量排序.cpu +3
uname -a # 查看Linux內核版本信息
stty 用來改變並打印終端行設置的經常使用命令 >密碼
read -t 10 varname # 更簡單的方法就是利用read命令的-t選項
iptables -F # 將防火牆中的規則條目清除掉
/etc/init.d/sendmail start # 啓動服務 
/etc/init.d/sendmail stop # 關閉服務
/etc/init.d/sendmail status # 查看服務當前狀態
/date/mysql/bin/mysqld_safe --user=mysql & # 啓動mysql後臺運行
vi /etc/rc.d/腳本.sh # 開機啓動執行 可用於開機啓動腳本
/etc/rc.d/rc3.d/S55sshd # 開機啓動和關機關閉服務鏈接 # S開機start K關機stop 55級別 後跟服務名
rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir # 同步目錄 # --delete 無差同步 刪除目錄下其它文件
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增長邏輯IP地址
mtr -r www.baidu.com # 測試網絡鏈路節點響應時間 # trace ping 結合
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping
ipcalc -m "$ip" -p "$num" # 根據IP和主機最大數計算掩碼
ssh -p 22 root@192.168.1.209 CMD # 利用ssh操做遠程主機
scp -P 22 文件 root@ip:/目錄 # 把本地文件拷貝到遠程主機
scp -r root@192.168.1.209:遠程目錄 本地目錄 # 把遠程指定文件拷貝到本地
sshpass -p '密碼' ssh -n root@$IP "echo hello" # 指定密碼遠程操做
ssh -o StrictHostKeyChecking=no $IP # ssh鏈接不提示yes
du -h 目錄 # 檢測目錄下全部文件大小
du -sh * # 顯示當前目錄中子目錄的大小
#鳥整理
ls -l --full-time #顯示具體時間
ls --full-time resource/
LANG=en_US #修改詫系
ls -R resource/ #遞歸顯示

users # 顯示全部的登陸用戶
groups # 列出當前用戶和他所屬的組
who -q # 顯示全部的登陸用戶
groupadd # 添加組
useradd user # 創建用戶
passwd 用戶 # 修改密碼

chown -R user:group # 修改目錄擁有者(R遞歸)
chown y\.li:mysql # 修改全部者用戶中包含點"."
umask # 設置用戶文件和目錄的文件建立缺省屏蔽值
chgrp # 修改用戶組
finger # 查找用戶顯示信息
echo "xuesong" | passwd user --stdin # 非交互修改密碼
useradd -g www -M -s /sbin/nologin www # 指定組並不容許登陸的用戶,nologin容許使用服務
useradd -g www -M -s /bin/false www # 指定組並不容許登陸的用戶,false最爲嚴格
usermod -l 新用戶名 老用戶名 # 修改用戶名
usermod -g user group # 修改用戶所屬組
usermod -d 目錄 -m 用戶 # 修改用戶家目錄
usermod -G group user # 將用戶添加到附加組
gpasswd -d user group # 從組中刪除用戶
su - user -c " #命令1; " # 切換用戶執行


腳本{
 
#!/bin/sh # 在腳本第一行腳本頭 # sh爲當前系統默認shell,可指定爲bash等shell
sh -x # 執行過程
sh -n # 檢查語法
(a=bbk) # 括號建立子shell運行
basename /a/b/c # 從全路徑中保留最後一層文件名或目錄
dirname # 取路徑
$RANDOM # 隨機數
$$ # 進程號
source FileName # 在當前bash環境下讀取並執行FileName中的命令 # 等同 . FileName
sleep 5 # 間隔睡眠5秒
trap # 在接收到信號後將要採起的行動
trap "" 2 3 # 禁止ctrl+c
$PWD # 當前目錄
$HOME # 家目錄
$OLDPWD # 以前一個目錄的路徑
cd - # 返回上一個目錄路徑
local ret # 局部變量
yes # 重複打印
yes |rm -i * # 自動回答y或者其餘
ls -p /home # 查看目錄全部文件夾
ls -d /home/ # 查看匹配完整路徑
echo `ls`   #執行 ls
echo -n aa;echo bb # 不換行執行下一句話 將字符串原樣輸出
echo -e "s\tss\n\n\n" # 使轉義生效
echo $a | cut -c2-6 # 取字符串中字元
echo {a,b,c}{a,b,c}{a,b,c} # 排列組合(括號內一個元素分別和其餘括號內元素組合)
echo $((2#11010)) # 二進制轉10進制
echo aaa | tee file # 打印同時寫入文件 默認覆蓋 -a追加
echo {1..10} # 打印10個字符
printf '%10s\n'|tr " " a # 打印10個字符
pwd | awk -F/ '{ print $2 }' # 返回目錄名
tac file |sed 1,3d|tac # 倒置讀取文件 # 刪除最後3行
tail -3 file # 取最後3行
outtmp=/tmp/$$`date +%s%N`.outtmp # 臨時文件定義
:(){ :|:& };: # 著名的 fork炸彈,系統執行海量的進程,直到系統僵死
echo -e "\e[32m....\e[0m" # 打印顏色
echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印顏色
}

變量{
A="a b c def" # 將字符串複製給變量
A=`cmd` # 將命令結果賦給變量
A=$(cmd) # 將命令結果賦給變量
eval a=\$$a # 間接調用
i=2&&echo $((i+3)) # 計算後打印新變量結果
i=2&&echo $[i+3] # 計算後打印新變量結果
a=$((2>6?5:8)) # 判斷兩個值知足條件的賦值給變量
A=(a b c def) # 將變量定義爲組數
$1 $2 $* # 位置參數 *表明全部
env # 查看環境變量
env | grep "name" # 查看定義的環境變量
set # 查看環境變量和本地變量
read name # 輸入變量
readonly name # 把name這個變量設置爲只讀變量,不容許再次設置
readonly # 查看系統存在的只讀文件
export name # 變量name由本地升爲環境
export name="RedHat" # 直接定義name爲環境變量
export Stat$nu=2222 # 變量引用變量賦值
unset name # 變量清除
export -n name # 去掉只讀變量
shift # 用於移動位置變量,調整位置變量,使$3的值賦給$2.$2的值賦予$1
name + 0 # 將字符串轉換爲數字
number " " # 將數字轉換成字符串
a=`ps -auxh|grep node|awk '{print $2}'`
for x in seq $a; do kill $x; done #刪除node的全部進程
}

declare -F #顯示當前可見的全部函數
declare -f #查看詳細函數代碼
 
ifconfig網卡{
#網卡的經常使用命令
ifconfig -a #查看全部網卡
ifconfig eth85
ifconfig eth85 down
ifconfig eth85 up
#在eth85網口上,配置IP地址爲156.41.50.11、子網掩碼爲255.255.255.0的IP
ifconfig eth85 156.41.50.11 netmask 255.255.255.0
#刪除eth85網口上,IP地址爲156.41.50.12、子網掩碼爲255.255.255.0的IP
ip addr del 156.41.50.12/24 dev eth85
ifconfig eth1:0 10.175.102.123 netmask 255.255.252.0 up 配置浮動ip
#防止重啓失效
在/etc/sysconfig/network目錄下,vi ifcfg-【網卡名稱】【Mac地址】
例:ifcfg-eth1 ifcfg-E0:24:7F:B6:FD:1B
在文件中加入IP信息,並保存文件
BOOTPROTO='static'
STARTMODE='auto'
IPADDR='182.3.1.180'
NETMASK='255.255.0.0'
重啓網卡讓IP生效 rcnetwork restart eth5
#樣例
BOOTPROTO='static'
BROADCAST=''
IPADDR='192.121.1.71'
NETMASK='255.255.255.0'
STARTMODE='auto'
USERCONTROL='no'
FIREWALL='no'
DEVICE=eth1
}
變量{
#賦值時等號兩邊不能有空格
#在使用變量時,要在變量前面加上符號$,但定義的時候不須要
變量的範圍
1、未經特殊處理的變量均爲全局變量
腳本中定義了的變量能夠在該腳本中任何其餘地方使用。
注意:函數內部定義的變量也能夠在該函數之外使用。
2、能夠用export把普通變量變成環境變量
環境變量能夠被其子進程使用,而普通變量不能夠。
export $var
3、能夠用local來定義一個局部變量
local關鍵字只能在函數內部使用。
用local定義的變量只能在本函數。
#特殊變量
有些變量是一開始執行Script時就會設定,擁有特定含義,而且不能加以修改的。這些是系統特殊變量:
$0 當前腳本的名稱
$n 腳本或函數的第n個參數值,n=1..9
$* 腳本或函數的全部參數
$# 腳本或函數的參數個數
$$ 當前shell進程的pid
$! 上一個shell後臺進程的pid
$? 上一條命令返回值
其餘參數:
$CDPATH 包含一系列目錄名,cd命令對他們諸葛進行搜索來查找做爲參數傳遞給它的目錄;若是該變量未設置,cd命令搜索當前目錄
$EDITOR 程序(如e-mail程序)裏使用的默認編輯器
$ENV UNIX查找配置文件的路徑
$HOME 用戶初次登陸時的起始目錄名
$MAIL 用戶的系統郵箱文件的名稱
$MAILCHECK shell檢查用戶郵箱是否有新郵件並將結果通知用戶的間隔時間(以秒爲單位)
$PATH 包含用戶的搜索路徑的變量—shell用來搜索外部命令或程序的目錄
$PPID 父進程的進程ID
$PS1 系統第一個提示符,通常爲$
$PS2 系統第二個提示符,通常爲>
$PWD 當前工做目錄的名稱
$TERM 用戶的控制終端的類型.
$LINENO 所在的代碼行,通常用來輸出錯誤行號
shift [n] 將命令行參數往左移n位,但$0不變
export 變量名錶 將變量名錶所列變量傳遞給子進程
read 變量名錶 從標準輸入讀字符串,傳給指定變量
echo 變量名錶 將變量名錶指定的變量顯示到標準輸出
set 顯示設置變量
env 顯示目前全部變量
 
set命令能夠從新設定參數表.如set hello wold命令會設定$*爲字符串hello world,$n和$#也同時受影響。
shift命令能夠將全部參數左移一個單位,$*、$n、$#均受影響
}

數組{
1.初始化
#!/bin/bash
#指定索引值
array1[0]=one
array1[1]=1
echo ${array1[0]}
echo ${array1[1]}
#全數組初始化
array2=( one two three )
echo ${array2[0]}
echo ${array2[2]}
#間隔索引
array3=( [9]=nine [11]=11 )
echo ${array3[9]}
echo ${array3[11]}
#讀取鍵盤輸入,空格隔開,換行結束
read -a array4
exit 0
2.操做
!/bin/bash
array=( apple bat cat dog elephant frog )
#打印第一個元素
echo ${array[0]}
echo ${array:0}
#打印全部元素
echo ${array[@]}
echo ${array[*]}
echo ${array[@]:0}
#除了第一個元素,打印全部元素
echo ${array[@]:1}
#從第二個元素開始,打印四個元素
echo ${array[@]:1:4}
#第一個元素的長度
echo ${#array[0]}
echo ${#array}
#總元素數
echo ${#array[*]}
echo ${#array[@]}
#將元素的a替換爲A
echo ${array[@]//a/A}
exit 0
3.遍歷
for i in 「${array[@]}」
do
#access each element as $i. . .
done
for x in ${b[@]};do echo $x; done
4.刪除
直接經過:unset 數組[下標] 能夠清除相應的元素。
echo ${varlist[*]}
1 100 3 4 5 8
unset varlist[7]
echo ${varlist[*]}
1 100 3 4 5
不帶下標,清除整個數據
unset varlist
}

sed
{
sed -i 's/cpu/lgj/' sys_info.txt #將修改生效到原文件
經常使用sed的語法:
1. p:打印
sed 'num1,num2p' fileName #打印fileName中的num1到num2行
2. s:替換字符串
sed 's/str1/str2/' fileName #把fileName中str1替換成str2(只替換每一行中的第一個str1)
3. g:全局
sed 's/str1/str2/g' fileName #把fileName中str1替換成str2(替換全部的)
4. y:替換字符
sed 'y/abc/ABC/g' fileName #把fileName中全部的a替換成A,b替換成B,
參數-e:執行一條命令。能夠用-e參數給一行一次執行多條命令以提升效率
sed –e 'command1' –e 'command2' …… fileName #文件中的每一行執行命令:command1 #command2 ......
^:行的開頭
$:行的結尾
sed 's/^str1/str2/' fileName #把fileName中每行開頭的str1替換成str2
sed –e 's/^str1/str2/' –e 's/str1$/str2/' fileName
 
一些經常使用場景介紹:
1.行的匹配
sed -n '2p' /etc/passwd 打印出第2行
sed -n '1,3p' /etc/passwd 打印出第1到第3行
sed -n '$p' /etc/passwd 打印出最後一行
sed -n '/user/'p /etc/passwd 打印出含有user的行
sed -n '/\$/'p /etc/passwd 打印出含有$元字符的行,$意爲最後一行
2.插入文本和附加文本(插入新行)
sed -n '/FTP/p' /etc/passwd 打印出有FTP的行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sed '/FTP/ a\ 456' /etc/passwd 在含有FTP的行後面新插入一行,內容爲456
sed '/FTP/ i\ 123' /etc/passwd在含有FTP的行前面新插入一行,內容爲123
sed '/FTP/ i\ "123"' /etc/passwd在含有FTP的行前面新插入一行,內容爲"123"
sed '5 a\ 123' /etc/passwd 在第5行後插入一新行,內容爲123
sed '5 i\ 「12345」' /etc/passwd 在第5行前插入一新行,內容爲「123453.刪除文本
sed '1d' /etc/passwd 刪除第1行
sed '1,3d' /etc/passwd 刪除第1至3行
sed '/user/d' /etc/passwd 刪除帶有user的行
sed -i '/^$/d' ver_info.txt #刪除空行
sed 's/remote_gateway_hostname.*/remote_gateway_hostname=/' config.ini #頗有用
4. 替換文本,替換命令用替換模式替換指定模式,格式爲:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
sed 's/user/USER/' /etc/passwd 將第1個user替換成USER,g代表全局替換
sed 's/user/USER/g' /etc/passwd 將全部user替換成USER
sed 's/user/#user/' /etc/passwd 將第1個user替換成#user,如用於屏蔽做用
sed 's/user//' /etc/passwd 將第1個user替換成空
sed 's/user/&11111111111111/' /etc/passwd 若是要附加或修改一個很長的字符串,可使用( &)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面,這裏是把&放前面
sed 's/user/11111111111111&/' /etc/passwd 這裏是將&放後面
5. 快速一行命令
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b鍵)
's / \ . $ / / g' 刪除以句點結尾行
'-e /abcd/d' 刪除包含a b c d的行
's / [ ] [ ] [ ] * / [ ] / g' 刪除一個以上空格,用一個空格代替
's / ^ [ ] [ ] * / / g' 刪除行首空格
's / \ . [ ] [ ] * / [ ] / g' 刪除句點後跟兩個或更多空格,代之以一個空格
'/ ^ $ / d' 刪除空行
's / ^ . / / g' 刪除第一個字符
's /COL \ ( . . . \ ) / / g' 刪除緊跟C O L的後三個字母
's / ^ \ / / / g' 從路徑中刪除第一個\
's / [ ] / [ ] / / g' 刪除全部空格並用t a b鍵替代
'S / ^ [ ] / / g' 刪除行首全部t a b鍵
's / [ ] * / / g' 刪除全部t a b鍵
若是使用sed對文件進行過濾,最好將問題分紅幾步,分步執行,且邊執行邊測試結果。
}

cat
{
主要有三大功能:
1.一次顯示整個文件。$ cat filename
2.從鍵盤建立一個文件。$ cat > filename <<qq
qq
建立fiename文件,追加內容,遇到qq時結束輸入
只能建立新文件,不能編輯已有文件.
3.將幾個文件合併爲一個文件: $cat file1 file2 > file
 
cat -n config.ini 顯示行編號
}
cut
{
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
使用說明
cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。
若是不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一。
 
主要參數
-b :以字節爲單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標誌。
-c :以字符爲單位進行分割。
-d :自定義分隔符,默認爲製表符。
-f :與-d一塊兒使用,指定顯示哪一個區域。
-n :取消分割多字節字符。僅和 -b 標誌一塊兒使用。若是字符的最後一個字節落在由 -b 標誌的 List 參數指示的<br />範圍以內,該字符將被寫出;不然,該字符將被排除
#實例
$ cat /etc/passwd | tail -n 5 | cut -d : -f 1
postfix
apache
icecream
mysql
news
}
du
{
查看目錄的大小
-s 只顯示最終結果
-m 以M爲單位顯示
-k 以K爲單位顯示
-h 以合適的單位顯示
經常使用:
du –hs ./*
}

expect 
{

#!/usr/bin/expect -f
if {$argc < 2} {
#打印
  puts stdout "$argv0 err params\n"
  exit 1
}
#行後面不能夠加註釋
#定義函數
proc do_console_login {login pass} {
puts $login;
puts $pass;
}
#打印參數長度
puts [llength $argv]
#設置變量
#set timeout -1 設置expect永不超時
set timeout 5
#設置超時時間
set user [lindex $argv 0]
#獲取腳本運行時帶的第一個參數值
set password [lindex $argv 1]
#調用函數
do_console_login $user $password
 
spawn ssh $user@10.175.102.219
#判斷上次輸出結果裏是否包含「password:」的字符串,若是有則當即返回,不然就等待一段時間後返回,等待時長就是前面設置的10秒。
#開始匹配後,裏面不能夠在行後面加註釋
expect {   
"(yes/no)?" {
send "yes\r"
expect "password:"
send "$password\r"
exp_continue
}
"*assword" {
send "$password\r"
exp_continue
}
}
 
########## puts 會把全部的打印都放在一塊兒############
#遍歷的幾種方法:
foreach i { 1 3 5 7 9 } {
puts "$i"
}
#i默認增量是1,即等價incr i 1
puts "---1---"
for {set i 0} {$i < 3} {incr i} {
puts "I inside first loop: $i"
}
 
puts "---2---"
for {set i 3} {$i < 2} {incr i} {
puts "I inside second loop: $i"
}
 
puts "---3---"
set i 0
while {$i < 4} {
puts "I inside third loop: $i"
incr i
puts "I after incr: $i"
}
 
set i 0
incr i
puts "---4---"
puts "$i"
#expect裏的加減法
set i [expr {$i + 1}]
puts "---5---"
puts "$i"
 
#替代手工輸入,執行命令,每條命令以空格隔開!
if { 1 eq 1 } {
puts "SYNC complete!"
} else {
puts "SYNC error!"
}
#if 的用法
set File "/usr/lgj"
if {[file isfile $File]!=1} {
send_user "$argv0: file $File not found. "
send_user "mkdir $File\n"
send "cd /usr/\r mkdir $File\n"
send "cd lgj\n touch 11.log\r"
}
send_user "for use\n"
 
send_user "read file as print\n"   
#################打開原主機中的文件在登錄機上打印################
set fd [open "./test.sh" "r"]
set number 0
# read each line
while { [gets $fd line] >= 0} {
incr number
#puts "Number of lines: $number"
puts $line
}
send_user "read file as cmd\n"
close $fd
#################打開原主機中的文件做爲shell命令行在登錄機上執行#####
set fd [open "./lgj.sh" "r"]
set number 0
while { [gets $fd line] >= 0} {
incr number
send "$line\n"
}
close $fd
 
puts "you do next!";
#把控制權交給控制檯,這個時候就能夠手工操做
interact
} 




 
相關文章
相關標籤/搜索