shell 杂记一(笨鸟)
查找子串
cat /tmp/debug.log | perl -e 'while(<>) { if ($_ =~ /hd_uid=(\d+)/) { print "$1\n"; } } '? 匹配每行"hd_uid="后面的數字
if [ ... ]
then
??? ...
fi
exit num
case $i in
1)
??? echo 1111;;
2)
??? echo 2222;;
*)
??? echo other;;
esac
basename 返回shell腳本名
var=$(n=1;while ((n<=$num));do echo $n;((n++));done)? 雙小括號表示算數運算
echo $var
>>1 2
可以把$var拿來做for循環用
shell注釋:
#! /bin/sh
Shell腳本中用#表示注釋,相當于C語言的//注釋。但如果#位于第一行開頭,并且是#!(稱為Shebang)則例外,它表示該腳本使用后面指定的解釋器/bin/sh解釋執行。
shell注釋-->
??? A、方法一
:<<BLOCK'
....注釋內容
??? 'BLOCK
B、方法二
:<<'BLOCK
....注釋內容
BLOCK'
C、方法三
:<<'
??? ....注釋內容
??? '
以上三種方法都是通過在:<
BLOCK為Here Documents中的定義符號可以隨意起名,只要前后匹配就行了
??? 更帥的方法:
??? cat <<"EOF" > /dev/null
??? this
??? is
??? a
??? multi-
??? line
??? comment
??? EOF
??? 或者:
??? : cat <<"EOF"
??? this
??? is
??? a
??? multi-
??? line
??? comment
??? EOF?????? ?
<--shell注釋
eval
eval的作用是再次執行命令行處理,也就是說,對一個命令行,執行兩次命令行處理。
eval echo "\$$#"? 輸出最后一個參數,不用eval的話只能輸出$number,還不是$number中存儲的數據
?paste file1 file2???? 把兩個文件的各行連在一起作為新行打印出來
??? split -1 file1.txt??? 文件分割,按照一行一個文件分割
兩種計算字符串長度的方法,注意區別,awk取得的是準確值
[dongsong@tm4ctt143 shell_study]$ echo "sfff"|wc -c
5
[dongsong@tm4ctt143 shell_study]$ echo "sfff"|awk '{print length($0)}'
4
[dongsong@tm4ctt143 shell_study]$ read testStr
a(后面四個空格)
[dongsong@tm4ctt143 shell_study]$ echo $testStr|awk '{print length($0)}'
1
[dongsong@tm4ctt143 shell_study]$ echo $testStr|wc -c
2
<linux與unix shell編程指南 005.pdf>
command > filename 把把標準輸出重定向到一個新文件中
command >> filename 把把標準輸出重定向到一個文件中(追加)
command 1 > fielname 把把標準輸出重定向到一個文件中
command > filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個文件中
command 2 > filename 把把標準錯誤重定向到一個文件中
command 2 >> filename 把把標準輸出重定向到一個文件中(追加)
command >> filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個文件中(追加)
command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作為標準輸入,以f i l e n a m e 2文件
作為標準輸出
command < filename 把c o m m a n d命令以f i l e n a m e文件作為標準輸入
command << delimiter 把從標準輸入中讀入,直至遇到d e l i m i t e r分界符
command <&m 把把文件描述符m作為標準輸入
command >&m 把把標準輸出重定向到文件描述符m中
command <&- 把關閉標準輸入
command<<delimiter將分界符delimiter之后直至下一個同樣的分界符之前的所有內容都作為輸入,遇到下一個分界符,shell就知道輸入結束了。
<以下可以在 linux與unix shell編程指南 002.pdf 中找到>
?????? touch -t 05042140 test.txt 創建一個更改時間是5月4號21:90的文件
?????? find . -newer test.txt??? 尋找比test.txt更新的文件
?????? find . -newer !test.txt??? 與上面相反
?????? find . -type d??? 查找當前目錄下的目錄
?????? find . ! -type d | sort 查找當前目錄下除目錄以外的文件,后面管道加上sort是排序
?????? find . -type f -mtime -10 -print -mount -exec wc -l {} \;
?????? find . -type f -mtime -10 -print -mount |xargs wc -l??? 與上面等同,只是xargs一批一批的執行,exec把前面所有的當成參數一次執行()
??????? find . -name "*.cpp" | xargs grep "int"???? 在文件中查找int
??? ls *.sql | grep -v 2011-11-17 | xargs rm??????? ***名字不含2011-11-17字樣的sql文件
tcpdump -i lo port 389 -s 1000000 -A
tcpdump -i lo -s 10000 -A -w /home/team/ddd port 389? 抓包
tcpdump -i eth0 -s 10000 -A -nnn host 10.0.4.133 and port 80
tcpdump -i eth0 -nnn port 1234
-nnn是顯示數字,便于直接觀看結果
?
?
tcpdump -i eth0 port 1234 -w xxx.txt
-w把抓包的數據寫入文件,可以在win下面用wireshark查看網絡數據
把整個文件夾 folderTared 的內容打包成一個gz文件:
tar zvcf folderTared.tar.gz /theDir/folderTared
把壓縮的gz文件恢復到指定目錄下:
tar zvxf folderTared.tar.gz /theDir/
gunzip t_wiki_doc-2011-10-12.sql.gz
svn checkout ./gamechat http://10.4.3.143/subversion/gamechat/
svnserve --root /data/svn/svn --daemon 把其他倉庫的svn數據目錄的文件夾直接拷貝到/data/svn/svn下面,運行啟動后可正常工作!
svn詳細配置:http://wiki.ubuntu.org.cn/SubVersion
[dongsong@tm4ctt143 udplogger]$ md5sum udplogger
23ee4c96305af409d8092e2553ff4357? udplogger
cat /etc/issue??????????????????????? 查詢系統版本
file /sbin/init???????????????? 查詢系統是32位還是64位等相關信息
uname -a??????? 查看系統版本的幾種方法
cat /proc/version
cat /etc/issue
lsb_release???? -a
/sbin/ip???? link??????? 查看系統網卡信息的幾種方法
? 541? wget http://mirror.centos.org/centos/5/os/SRPMS/glibc-2.5-34.src.rpm???? 下載
--
?nc -u 10.4.3.143 873???????????? 向143機器的873端口發送UDP數據
??? nc -l 2010??????????????? 監聽當前機器的2010端口并顯示連接建立起來后受到的數據,需要回復數據可以直接輸入
top看不到所有進程,可以用top -b -d 1 -n 1 | less (-d delay延遲1秒更新,-n抓一次快照)
??? pstree -p 顯示系統內所有進程構成的進程樹(除了用ps axo 'ppid,pid,cmd'來找進程的父進程以外還可以從進程樹里面找)
????? To print a process tree:
????????? ps -ejH
????????? ps axjf
?????? To get info about threads:
????????? ps -eLf
????????? ps axms
??? 僵尸進程會占用一部分內存(保存進程退出信息的結構體),可以殺掉其父進程以回收資源(當然,這樣干可能會影響父進程的業務)
--
cat /proc/sys/kernel/shmmax??????? 查看系統單個共享內存段最大字節數
cat /proc/sys/kernel/shmmni??????? 查看系統共享內存段最大個數
cat /proc/sys/kernel/shmall??????? 查看系統中共享內存頁總數
?ipcs -lm??????????????? 查看系統共享內存的參數
----------------------------------------------------
[dongsong@tm4ctt143 ~]$ vvv="Hello world"
[dongsong@tm4ctt143 ~]$ echo ${vvv}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:-xxxxx}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvvv:-xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo $vvvv
[dongsong@tm4ctt143 ~]$ echo ${vvvv}
[dongsong@tm4ctt143 ~]$ echo ${vvvv:=xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvvv}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvva:?EEEEEEErrrrrrr}
bash: vvva: EEEEEEErrrrrrr
[dongsong@tm4ctt143 ~]$ echo ${aa:+hello}
[dongsong@tm4ctt143 ~]$ echo $aa
[dongsong@tm4ctt143 ~]$ echo ${va:+hello}
[dongsong@tm4ctt143 ~]$ echo ${vvv:+hello}
hello
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:4}
Hell
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:2}
He
[dongsong@tm4ctt143 ~]$ echo ${vvv: -3}
rld
[dongsong@tm4ctt143 ~]$ echo ${!v*}
vvv vvvv
[dongsong@tm4ctt143 ~]$ echo ${#vvv}
11
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ vvv="a.b.php.org"
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.php.org"
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org}
/home/yy/a.b.php
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.php.org
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.org.php.org"
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.org.php.org
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org*}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ man bash
--------------------------------------------------------------------
curl http://www.baidu.com 對指定url發出請求,可以-d用post方式、-G用get方式;用于測試比較方便,省去打開瀏覽器的麻煩
siege -f myurls.txt -t 60S [-r 100000] -d 3 -i -c 128 (128 users;3 delay )測試http性能(做壓力測試時-d可指為零;內網測試機212的apache用siege和ab測試結果差不多,每秒處理2W+請求)
ab -n 10000 -c 10 http://192.168.1.212:8088/ apache提供的http測試工具
ab -v 顯示參數及說明
sar -n DEV 2? 網卡流量監控
ls -lhrt /var/log/sa/? 查看sysstat的日志
sar -f /var/log/sa/sa13
sar -f /var/log/sa/sa13? |less
? 675? sar -o data.bin 1????? 記錄cpu等信息
? 676? sar -o data2.bin 1
? 677? ls
? 678? sar -f data.bin????? 顯示cpu等信息
? 679? sar -f data.bin? -A | less
----------------
?stat filename???????? 顯示文件的設備號和inode
------------------
cat /proc/partitions查看目前機器中的所有磁盤及分區情況
------------------------
umask是從權限中“拿走”相應的位(具體見 linux與unix shell編程指南 001.pdf)
(系統不允許你在創建一個文本文件時就賦予它執行權限,必須在創建后用chmod命令增加這一權限)
---------------------------
[dongsong@localhost soft]$ du -sh?????? 查看目錄大小
3.5G??? .
[dongsong@localhost soft]$ df -Th??????????????? 查看掛載點
文件系統????? 類型??? 容量? 已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
????????????? ext3??? 6.7G? 4.6G? 1.8G? 73% /
/dev/hda1???? ext3???? 99M?? 12M?? 83M? 13% /boot
tmpfs??????? tmpfs??? 252M???? 0? 252M?? 0% /dev/shm
/dev/hdd5???? ext3???? 14G? 4.0G? 9.2G? 30% /home
--------------------------------
[dongsong@localhost soft]$ du -sh?????? 查看目錄大小
3.5G??? .
[dongsong@localhost soft]$ df -Th??????????????? 查看掛載點
文件系統????? 類型??? 容量? 已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
????????????? ext3??? 6.7G? 4.6G? 1.8G? 73% /
/dev/hda1???? ext3???? 99M?? 12M?? 83M? 13% /boot
tmpfs??????? tmpfs??? 252M???? 0? 252M?? 0% /dev/shm
/dev/hdd5???? ext3???? 14G? 4.0G? 9.2G? 30% /home
-----------cp start--------------
copy 本地的檔案到遠程的機器上
scp /etc/lilo.conf k@net67.ee.oit.edu.tw:/home/k
會將本地的 /etc/lilo.conf 這個檔案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家目錄下。
copy遠程機器上的檔案到本地來
scp k@net67.ee.oit.edu.tw:/etc/lilo.conf /etc
會將 net67.ee.oitdu.tw 中 /etc/lilo.conf 檔案 copy 到本地的 /etc 目錄下。
保持從來源 host 檔案的屬性
scp –p k@net67.ee.tw:/etc/lilo.conf /etc
如果想使用特定端口 使用 scp –P(大寫) 如 scp –P 1234 k@net67.ee.tw:/etc/lilo.conf /etc
在此必須注意使用者的權限是否可讀取遠程上的檔案,若想知道更多關于 scp 的使用方法,可去看看 scp 的使用手冊。
ssh-keygen
產生公開鑰 (pulib key) 和私人鑰 (private key),以保障 ssh 聯機的安性, 當 ssh 連 shd 服務器,會交換公開鑰上,系統會檢查 /etc/ssh_know_hosts 內儲存的 key,如果找到客戶端就用這個 key 產生一個隨機產生的session key 傳給服務器,兩端都用這個 key 來繼續完成 ssh 剩下來的階段。
它會產生 identity.pub、identity 兩個檔案,私人鑰存放于identity,公開鑰 存放于 identity.pub 中,接下來使用 scp 將 identity.pub copy 到遠程機器的家目錄下.ssh下的authorized_keys。 .ssh/authorized_keys(這個 authorized_keys 檔案相當于協議的 rhosts 檔案),之后使用者能夠不用密碼去登入。RSA的認證絕對是比 rhosts 認證更來的安全可靠。想讓多臺機器都不輸密碼直接往A上拷數據,可以把這幾臺機器的identity.pub追加到A得authorized_keys文件后面。
執行:
scp identity.pub k@linux1.ee.oit.edu.tw:.ssh/authorized_keys
若在使用 ssh-keygen 產生鑰匙對時沒有輸入密碼,則如上所示不需輸入密碼即可從 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,這里輸入的密碼可以跟帳號的密碼不同,也可以不輸入密碼。
-----------scp end----------------
ssh -p 7710 root@220.181.83.115 -v? ssh登錄
nohup ********* &???? 轉后臺運行
-----------------------------
設置sudo不輸入密碼:sudo visudo 或者 sudo vi /etc/sudoers, 按如下修改
%admin ALL=(ALL)NOPASSWD:NOPASSWD ALL? //admin組的用戶sudo所有命令都不用輸入密碼
%guy ALL=NOPASSWD:ALL //用戶guy sudo 所有命令都不用輸入密碼
%guy ALL=NOPASSWD:/usr/bin/tt.sh,/usr/sbin/adduser //用戶guy sudo指令命令不用輸入密碼
--------------------------------------------------
fg、bg、jobs、&、ctrl + z都是跟系統任務有關的,雖然現在基本上不怎么需要用到這些命令,但學會了也是很實用的
一。& 最經常被用到
?? 這個用在一個命令的最后,可以把這個命令放到后臺執行
二。ctrl + z
???? 可以將一個正在前臺執行的命令放到后臺,并且暫停
三。jobs
???? 查看當前有多少在后臺運行的命令
四。fg
???? 將后臺中的命令調至前臺繼續運行
?? 如果后臺中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的后臺正在執行的命令的序號(不是pid)
五。bg
???? 將一個在后臺暫停的命令,變成繼續執行
?? 如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的后臺正在執行的命令的序號(不是pid) ?
---------------------------
源代碼之間建立跳轉鏈接
??? ctags -R
??? cscope -b -R *.cpp *.hpp
?? ?
??? ctags建立之后可以用ctrl+] 和ctrl+t進行正反向跳轉,在bash下面之間用vi -t name可以打開函數或者變量定義的文件(功能真風騷,貌似我只用了ctags的1%)
???? vim xxx.c之前要把當前路徑切換到ctags所在目錄去,否則找不到符號
??? ctags的用法:http://oreilly.com/catalog/vi6/chapter/ch08.html#ch08_05.htm
??? ctags的官網:http://ctags.sourceforge.net/
??? 對lua建立ctag: ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=pattern -R .
這招不錯
find -name '*.[ch]' -exec ctags {} +
這個不行,雖然ls -R 會把目錄下面的子目錄全部遞歸遍歷一遍,不過ctags并不僅僅是對過濾出來的文件建了tag而是對所有的(ctasg -R)
ls -lhrtR ./* | egrep "*\.h$|*\.cpp$" | ctags -R??
vim -t functionName 打開tag定義的文件,并定位到該位置
ctrl+]? 跳轉到定義的位置
ctrl+t 回到跳轉的位置
ctrl+o 回到光標上次所在的位置
ctrl+i 前進到光標回跳前的位置
ctrl+e 保持光標不動把頁面向上移動
ctrl+y 保持光標不動把頁面向下移動
-------------------------------------------------------------------------------------------------------------
轉載于:https://blog.51cto.com/fuwenchao/1422515
總結
以上是生活随笔為你收集整理的shell 杂记一(笨鸟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSP430F5529 DriverLi
- 下一篇: python基础编程第三版 pdf_py