<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              常用的shell腳本 linux腳本之間的傳遞參數

              來源:CSDN 時間:2023-02-03 14:53:40

              1、腳本之間傳遞參數 "1.sh"的腳本,接受參數。如下,如果有一個參數則賦值個sourceFile這個變量,否則用默認值。

              Shell代碼

              #!/bin/bash


              【資料圖】

              LANG=en_US.UTF-8

              #get parameters

              sourceFile="/data/log/abc"

              if [ $# == 1 ]

              then sourceFile=$1

              else echo "$1 required!"

              fi

              echo $sourceFile

              備注:這里$#是傳遞參數的個數,$1 是具體的參數。 關于if else: 如果兩條命令寫在同一行則需要用";"號隔開,一行只寫一條命令就不需要寫";"號了。和[命令一樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,如果該子命令的Exit Status為0(表示真),則執行then后面的子命令,如果Exit Status非0(表示假),則執行elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括號,所以用fi表示if語句塊的結束。 "2.sh"的腳本,傳遞參數

              Shell代碼

              #!/bin/bash

              sh 1.sh 參數1 參數2 ...  

              備注:多個參數之間用空格符隔開。 2、文件內容行之間的排序

              Shell代碼

              #!/bin/bash

              sort -t= +4 文件 ”

              備注:“=”表示按=號進行切割(注意:只能是單個字符),“+4”表示按第五個項進行排序。 更多參數: -r 表示降序排序 -n 表示按數字大小排序 -k 表示根據那個字段排序,4.1,表示第4列第一個字符開始 ,5表示到第5個字段為結束 -t 后面跟分隔符,缺省是空格 例如:sort -r -n -k4.1,5 3、判斷目錄是否存在,沒有則新建一個目錄

              Shell代碼

              #!/bin/bash

              dayDir="/home/logs/"

              if [ ! -d "$dayDir" ]

              then mkdir "$dayDir" fi

              4、判斷文件是否存在,有則刪除

              Shell代碼

              #!/bin/bash

              if [ -f "$FAIL_FILE" ]

              then

              rm -rf "$FAIL_FILE"

              echo `date`" FILE IS EXISTS: "$FAIL_FILE

              fi

              5、找出文件中的相關行

              Shell代碼

              #!/bin/bash

              cat 文件 |grep -a "關鍵詞" >> result.log

              備注:把文件中包含關鍵詞的行輸出到result.log中。 6、文件切分

              Shell代碼

              #!/bin/bash

              awk -F"" "{print $1}" 文件

              備注:“”表示分隔符,“print”表示換行輸出(printf不換行),“$1”表示取第一項?!拔募北硎疽蟹值奈募?7、文件內容排重

              Shell代碼

              #!/bin/bash

              awk -F"," "!a[$1]++" test.txt

              備注:“,”表示按“,”號分隔;“$1”表示按第一項排重;“test.txt”表示要處理的文件。 8、grep多個關鍵字

              Shell代碼

              #!/bin/bash

              cat $file |grep -a "aop=keyword1\|keyword2"

              備注:多個關鍵字用“\|”分隔。 9、時間格式化,中間有空格的需要加引號

              Shell代碼

              #!/bin/bash

              TODAY=`date -d today "+%Y-%m-%d %H:%M:%S"`

              10、多個文件合并

              Shell代碼

              #!/bin/bash

              cat $FILE1 $FILE2 |grep -a "關鍵字" > $MERGE_FILE

              11、運行java項目

              Shell代碼

              #!/bin/bash

              LANG=en_US.UTF-8

              export LANG=$LANG

              /usr/java/latest/bin/java -cp . -Djava.ext.dirs=../lib 包.類(含main方法) -a 參數1 -b 參數2

              備注:“/usr/java/latest/bin/java”表示Java環境,“-cp”表示classpath路徑,“.”表示當前目錄,“-Djava.ext.dirs”表示jar文件所在目錄,“-a”表示參數名稱,“參數1”表示參數值。 12、根據關鍵字統計行數,賦值給變量

              Shell代碼

              #!/bin/bash

              COUNT=$(cat $FILE |grep -a "關鍵字" |wc -l)

              備注:“$FILE”表示要統計的文件,“關鍵字”要包含的關鍵字,“wc”統計文件(-l行數,-w字數,-c字節數) wc命令的功能為統計指定文件中的字節數、字數、行數, 并將統計結果顯示輸出。 語法:wc [選項] 文件… 說明:該命令統計給定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所有指定文件的總統計數。字是由空格字符區分開的最大字符串。 該命令各選項含義如下: -c 統計字節數。 -l 統計行數。 -w 統計字數。 這些選項可以組合使用。 輸出列的順序和數目不受選項的順序和數目的影響??偸前聪率鲰樞蝻@示并且每項最多一列。 行數、字數、字節數、文件名 如果命令行中沒有文件名,則輸出中不出現文件名。 例如: $wc -lcw file1 file2 4 33 file1 7 52 file2 11 11 85 total 省略任選項-lcw,wc命令的執行結果與上面一樣。 13、基本算術計算的方法(5種) a.使用awk計算

              Shell代碼

              #!/bin/bash

              ##示例1:10和12為兩個參數分別對應$1和$2

              echo 10 12 |awk "{printf("%d\n", $1+$2)}"

              ##示例2:a和b作為兩個變量傳入

              a=10

              b=12

              echo |awk "{printf("%d\n", "$a"+"$b")}"  

              ##示例3:COUNT_FAIL除以COUNT_INIT 保留4為小數,結果賦值給FAIL_INIT,[b]結果四舍五入[/b]。

              COUNT_FAIL=10

              COUNT_INIT=20

              FAIL_INIT=`awk "BEGIN{printf "%.4f\n","$COUNT_FAIL"/"$COUNT_INIT"}"`

              echo $FAIL_INIT

              備注:示例2和示例3兩種寫法除數和被除數都要加“"”號(單引號),否則會報錯“division by zero attempted”,另外“BEGIN”也很重要哦。 b.使用bc命令

              Shell代碼

              #!/bin/bash

              ##示例1:輸出 1+2 的運算結果

              echo 1+2 |bc  

              ##示例2:COUNT_FAIL除以COUNT_INIT 保留2為小數,結果賦值給FAIL_INIT,[b]結果不四舍五入[/b]。

              FAIL_INIT=`echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc`

              c.使用expr命令

              Shell代碼

              #!/bin/bash

              count=10

              count=`expr $count + 12`  

              echo $count

              d.使用let命令

              Shell代碼

              #!/bin/bash

              ##示例1

              let num1=10*20  

              echo $num1

              ##示例2

              let "num2=10*20"

              echo $num2

              e.加雙括號

              Shell代碼

              #!/bin/bash

              ##示例1:雙小括號

              a=12

              b=20

              echo $((a*b))  

              echo $(($a*$b))

              ##示例2:中括號

              c=10

              echo $[c*20]

              echo $[$c*20]

              備注:此種寫法括號里面的變量可以不用加“$”符號,但是括號外面的“$”符號一定要加上。14、運用tee命令將日志同時輸出到多個文件 tee用法功能說明:讀取標準輸入的數據,并將其內容輸出成文件。 語 法:tee [-ai][--help][--version][文件...] 補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。 參 數: -a或--append 附加到既有文件的后面,而非覆蓋它. -i或--ignore-interrupts 忽略中斷信號。 -help 在線幫助。 -version 顯示版本信息。 例1:日志在記入log1.txt和log2.txt的同時也在控制臺輸出

              Shell代碼

              #!/bin/bash

              echo "hello jack!" |tee -a log1.txt log2.txt  

              備注:“-a”追加,否則清空重寫。 15、針對某個域進行分組統計

              Shell代碼

              #!/bin/bash

              cat $FILE |awk -F"" "{list[$11]++;}END{for (val in list) print val, list[val];}" |tee -a $RESULT_FILE

              備注:“$FILE”要處理的文件,用awk命令按“”進行切分,“$11”表示第11域(1,3,5,...),“var”表示分組名稱,“list[var]”表示每組的數量。 16、查詢控制命令的歷史記錄

              Shell代碼

              #!/bin/bash history |grep "rm"

              備注:查詢包含“rm”字符的命令記錄。 17、循環刪除所有文件

              Shell代碼

              #!/bin/bash

              for i in `ls`; do rm $i; done

              備注:在文件非常多的情況下,rm * 命令不能刪除所有文件。所以需要遍歷刪除每一個文件。 18、遍歷文件夾并按第二個域對文件內容排序。

              Shell代碼

              #!/bin/bash

              #用等號分隔,按第二個域排序

              function sortfile(){

              echo "Processing: "$1 sort -t= +1 $1 > $1"_temp"

              mv $1"_temp" $1

              }

              #遍歷文件夾,調用排序函數

              function ergodic(){

              for file in `ls $1`

              do

              if [ -d $1"/"$file ]

              then

              ergodic $1"/"$file

              else

              f=$1"/"$file

              #調用排序函數

              sortfile $f

              fi

              done

              }

              #以參數形式運行程序

              if [ $# == 1 ];

              then

              echo "parameter: "$1;

              ergodic $1

              else

              echo "a file directory required!"

              fi

              19、查看文件夾下所有文件數目和所有文件夾數目

              Shell代碼

              #!/bin/bash

              #查看當前文件夾下所有文件數目

              find . -type f |wc -l

              #查看當前文件夾下所有文件夾數目

              find . -type d |wc -l

              備注:“.”表示當前目錄,可以換成其他路徑。 20、shell與java正則區別

              Java代碼

              String regex = "2010-11-08.+"

              //或者 regex = "2010-11-08.*"

              備注:JAVA中匹配以“2010-11-08"開頭的字符串。

              Shell代碼

              regex = "2010-11-08*"

              備注:SHELL中匹配以“2010-11-08”開頭的字符串。 “.*”或“.+”在java中表示任意多個字符串,如果要匹配“.”號,需要加轉義“\”。 “*”在shell表示任意多個字符,加“.”或“+”號都會錯誤。 21、編碼轉換命令

              Shell代碼

              iconv -f gb2312 -t utf-8 a.log > b.log

              備注:表示把a.log文件從gb2312編碼轉成utf-8的編碼,并把文件寫入b.log 22、批量替換多個文件中的字符串

              Shell代碼

              sed -i "s/<原始串>/<新串>/g" `grep <原始串> -rl < 目標文件或目錄>`

              備注: -i 表示inplace edit,就地修改文件 -r 表示搜索子目錄 -l 表示輸出匹配的文件名 23、常用MySQL語句 //查詢mysql變量(timeout) show variables like "%timeout" //查詢緩存變量 show status like "Qcache%" //查詢進程列表 show PROCESSLIST 24、清空memcache數據 telnet 10.27.5.71 11211 flush_all quit //退出telnet 25、監控Tomcat并啟動

              Shell代碼

              #!/bin/sh

              export _JAVA_SR_SIGNUM=12

              export JAVA_HOME=/usr/java/jdk1.6.0_11

              export CATALINA_BASE=/home/co_newest_family/tomcat

              export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18

              export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/

              export CATALINA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9158 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dfile.encoding=UTF8 -Dmeganotes.home=/home/co_newest_family"

              export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

              date=`date "+%H:%M:%S"`

              message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."

              request_url="http://10.27.5.81:9091/index.jsp"

              if ! wget -t1 -T2 $request_url &> /dev/null;then

              #pid=`ps aux | grep "\-Dcms4.home\=\/home\/co_newest_family\/"| awk "{print $2}"`

              #kill -9 $pid

              ps x|grep "tomcat"|grep -v "grep"|grep -v "sh"|awk "{print $1}"|xargs kill -9

              $CATALINA_HOME/bin/startup.sh

              wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;

              echo "$date check tomcat shutdown and restart it." >> logs/check.log

              else

              echo "$date check tomcat ok." >> logs/check.log

              fi

              rm -f index.jsp*

              rm -f send.jsp?msg=*

              備注:定時監控tomcat,發現掛掉,立刻重啟!并發送短信和郵件報告~ -t1 表示只請求一次 -T2 表示2秒超時 26、linux查找文件的一些方法 1) 按文件名查找 #在/opt目錄及其子目錄下查找包含文件名是以zhjedu開頭的文件 find /opt -name "zhjedu*"   2) 按時間查找 #在/opt目錄及其子目錄下查找最近1個小時修改的文件 find /opt -mtime -1 #在/opt目錄及其子目錄下查找1個小時以前修改的文件 find /opt -mtime +1 3)  按類型查找 #在/opt目錄及其子目錄下查找目錄及其子目錄 find /opt -type d #在/opt目錄及其子目錄下查找所有的普通文件 find /opt -type f 4) 按大小查找 #在/opt目錄及其子目錄下查找文件大于10M的文件 find /opt -size +10000k 27、curl命令的用法 參見1:http://blog.sina.com.cn/s/blog_62b832910100tyfi.html 參見2:http://javag.iteye.com/blog/499113 28、split切割大文件

              Shell代碼

              split -l 10000 log1_6.log.2012-03-21 tt.txt

              備注:將log1_6.log.2012-03-21文件切割成10000行一個的以tt.txt開頭的N多個文件 -l 表示按行切割 tt.txt 表示切割后的零碎文件的前綴 29、循環讀取行 讀取文件每行并輸出 方法一:

              Shell代碼

              #!/bin/sh

              while read line

              do

              echo $line

              done < filename

              方法二:

              Shell代碼

              #!/bin/sh

              cat filename | while read line

              do

              echo $line

              done

              30、刪除數量比較多的文件

              Shell代碼

              ls | xargs -n 20 rm -rf

              ls當然是輸出所有的文件名(用空格分割) xargs就是將ls的輸出,每20個為一組(以空格為分隔符),作為rm -rf的參數 也就是說將所有文件名20個為一組,由rm -rf刪除,這樣就不會超過命令行的長度了 31、for循環總結 a. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done b. 在shell中常用的是 for i in $(seq 10) c. for i in `ls` d. for i in ${arr[@]}   e. for i in $* ; do f. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do g. for i in f1 f2 f3 ;do h. for i in *.txt i. for i in $(ls *.txt)    for in語句與` `和$( )合用,利用` `或$( )的將多行合為一行的缺陷,實際是合為一個字符串數組    for num in $(seq 1 100) j. LIST="rootfs usr data data2"    for d in $LIST; do    用for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷 k. for i in {1..10} l. for i in stringchar {1..10} m. awk "BEGIN{for(i=1; i<=10; i++) print i}" 注意:AWK中的for循環寫法和C語言一樣的 參考:http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html 32、格式轉換 dos2unix, unix2dos 用來實現 DOS <=> UNIX text file 轉換

              Shell代碼

              unix2dos target.$date.txt

              dos2unix target.$date.txt

              33、根據起止日期打印期間的日期

              Shell代碼

              #!/bin/sh

              #riqizizeng

              datebeg=$1

              dateend=$2

              #read datebeg

              #read dateend

              beg_s=`date -d "$datebeg" +%s`

              end_s=`date -d "$dateend" +%s`

              while [ "$beg_s" -le "$end_s" ]

              do

              day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循環的日期

              beg_s=$((beg_s+86400))

              done

              34、用awk來對比兩個文件 要求:輸出a.txt中包含b.txt的行 命令:

              Shell代碼

              awk "NR==FNR{a[substr($2,3)]=$0;next}{if($0 in a)print a[$0]}" a.txt b.txt > c.txt

              備注:awk參數用法:http://bbs.chinaunix.net/thread-691456-1-1.htmlhttp://bbs.chinaunix.net/thread-1797847-1-1.html substr($2,3):表示截取a.txt第二列從第三個字符開始的所有字符。 if($0 in a):如果b.txt的一行跟a.txt第二列截取字符的相等。 a.txt(數據源1) ---------------- 12 x=abc 14 x=ccc 15 x=acd b.txt(數據源2) ---------------- abc ccc efg c.txt(結果) ---------------- 12 x=abc 14 x=ccc 35、在root用戶下查看端口被哪個用戶占用

              Shell代碼

              lsof -i:8091

              36、查看一個關鍵字的前后N行

              Shell代碼

              cat tomcat/debuglog/debug.log.2012-07-05-21  |grep -B 5 -A 25 java.net.SocketTimeoutException

              37、根據修改時間判定文件數目(適用于大數目文件夾哦)

              Shell代碼

              ll |awk "{print $6$7$8}" |grep Aug212012 |wc -l

              備注:$6表示月份,$7表示日期(最近幾天只顯示時間),$8表示年份。 如上命令表示:2012-08-21日產生的文件數目

              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩