bash – 在水一方 https://blog.vic.mh4u.org 蒹葭蒼蒼,白露為霜。所謂伊人,在水一方。 Sun, 29 Jan 2023 05:22:08 +0000 zh-TW hourly 1 https://wordpress.org/?v=6.7.1 陣列進階應用 https://blog.vic.mh4u.org/2023/1691 https://blog.vic.mh4u.org/2023/1691#respond Sun, 29 Jan 2023 05:22:08 +0000 http://blog.vic.mh4u.org/?p=1691 閱讀全文 ]]> 簡要說明:兩個陣列在同一個迴圈內同時展開內容,應用於同時有網址和下載後要儲存的檔名。

#!/bin/bash
#說明:兩個陣列在同一個迴圈內同時展開內容
#應用於:youtube 網址下載影片、下載後的檔案名稱
#建立日期: 2022/1020	更新日期:2023/0128
#作者:夢見草
#系統需求:需要安裝 youtube-dl 套件

###################變數宣告#############
INPUT=/tmp/t/http1.txt
OUPUT=/tmp/nfs/
fName=/tmp/t/filename.txt
###################變數宣告#############

#宣告變數annie 為陣列
declare -a URL
URL=(`cat $INPUT`)

declare -a john
john=(`cat $fName`)


#echo 計算陣列裡共有幾筆資料
#echo "${#URL[*]}"
count="${#URL[*]}"

#引用陣列的所有索引值(從0開始)
#echo ${!john[*]}

#底下開始帶出陣列內容

for ((index=0; index<$count; index++)); do
#index從0開始; index小於10; index每次加1
    #debug:
    #echo ${john[$index]} 
    #echo ${URL[$index]} 
    #開始使用背景抓檔 
    youtube-dl -f '137+140' --merge-output-format mp4 ${URL[$index]}  -o"$OUPUT${john[$index]}.mp4"
done   
]]>
https://blog.vic.mh4u.org/2023/1691/feed 0
bash處理csv檔 https://blog.vic.mh4u.org/2015/1490 https://blog.vic.mh4u.org/2015/1490#respond Thu, 03 Sep 2015 07:39:49 +0000 http://blog.vic.mh4u.org/?p=1490 閱讀全文 ]]> 由於asterisk的CDR是csv格式,想要分析特定欄位,如帳單秒數,我們可以使用底下的指令

cat Master.csv|cut -d, -f14

上面那行指令的意思是列出第14個欄位
若想要指定日期範圍的話,可增加一些指令

egrep “2015-08” Master.csv|cut -d, -f14
上面是指定2015年08月份的資料,只顯示第14個欄位

原本以為這樣就可以了,可是後來發現不夠,因為凡事總有例外,底下的內容就是例外:

"this, is the first entry", this is the second, 34.5
"Dial","SIP/a2/886980xxxxxx,60,XxWw","2015-09-03 14:04:23"

有沒有看到上面那兩行的例子,都是在兩個 ” 引號的中間有逗號,這就使我們單純的使用 cut 這個工具按 , 逗號來算第幾個欄位會出錯,因為算出來的欄位數是不一樣的,所以我們就需要專門處理csv的工具,它能把兩個引號中間的逗號給忽略掉。

所以我們要先安裝csvtool這個套件
aptitude install csvtool
用法簡介:
csvtool col 14 Master.csv
上的意思是指定顯示第14個欄位,若你想要使用管線搭配其它程式使用的話,那麼檔名你就要改成 – (減號),這樣它就支援stdin(標準輸入)

底下是搭配csvtool套件所寫的script

#!/bin/bash
#1確定檔名
logname=/var/log/asterisk/cdr-csv/$1.csv
#2指定日期範圍
dateRange=$2
#3指定欄位
column=$3

#使用說明:本程式後面要帶3個參數,分別用空格隔開
#語法: cdrchk.sh log檔名 指定日期範圍 指定欄位數字
#範例: cdrchk.sh A0000000013 2015-08 14

#日期範圍說明:一定要填,可指定年月日,語法: 年-月-日 ,若只想指定年月,語法:年-月
#若不想指定範圍則需填入 .*

if [ "${1}" == "" -o "${1}" == "help" -o "${1}" == "h" ] ;then
echo 使用說明:本程式後面要帶3個參數,分別用空格隔開
echo "語法: cdrchk.sh log檔名 指定日期範圍 指定欄位數字"
echo "範例: cdrchk.sh A0000000013 2015-08 14"
echo "日期範圍說明:一定要填,可指定年月日,語法1:年-月-日 語法2:年-月"
echo "若不想指定日期範圍則需填入 .*"
exit
fi
#egrep "$dateRange" $logname | cut -d, -f$column
egrep "$dateRange" $logname | csvtool col $column -

簡介:此程式後面要帶3個參數,若不帶任何參數的話,則會顯示使用說明,若帶 help 參數也會顯示使用說明。

]]>
https://blog.vic.mh4u.org/2015/1490/feed 0
條件判斷式 https://blog.vic.mh4u.org/2015/1477 https://blog.vic.mh4u.org/2015/1477#respond Sat, 11 Jul 2015 15:01:59 +0000 http://blog.vic.mh4u.org/?p=1477 閱讀全文 ]]> 條件式判斷,一般的應用鳥哥已寫的很清楚了,但他沒有寫到的是如何將正規表示法用於條件式判斷。

先說一下基本語法

if [ 條件判斷式 ]; then
	當條件判斷式成立時,可以進行的指令工作內容;
fi   <==將 if 反過來寫,就成為 fi 啦!結束 if 之意!

進階

# 一個條件判斷,分成功進行與失敗進行 (else)
if [ 條件判斷式 ]; then
	當條件判斷式成立時,可以進行的指令工作內容;
else
	當條件判斷式不成立時,可以進行的指令工作內容;
fi

搭配zentify的實例

#!/bin/bash
file="/home/backup/update.7z"
SSH1=sshserver1
zenity --question --title=更新luks '--text=3秒自動下載更新檔!\n或按否離開!' --timeout=3
#說明:zentify選項按是則此變數$?得0,不按得5。按否得1。
if [ $? = 0 -o $? = 5 ]; then 
	echo "下載"
	#mate-terminal -x bash -c "echo 從ssh1下載更新檔" ; scp $SSH1 $file ;
else
	echo "離開"
fi

更進階,這個就比較少用到了,但還是記一下

# 多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況執行
if [ 條件判斷式一 ]; then
	當條件判斷式一成立時,可以進行的指令工作內容;
elif [ 條件判斷式二 ]; then
	當條件判斷式二成立時,可以進行的指令工作內容;
else
	當條件判斷式一與二均不成立時,可以進行的指令工作內容;
fi

正規表式法

若要將正規表示法帶入判斷式裡,就只是個語法問題而已,重點在於 =~ 這兩個符號。

實例說明:
若我們要檢查對方上傳上來的檔案是不是按我們指定定的格式來命名,手機號碼-英文檔名.txt,如:0911111111-audio.txt 因此我們就要使用正規表示法來檢查它取的檔名合不合規定,不合規定就不予處理。

#!/bin/bash
fullfile=`find /home/ftp/upload/*.txt |sed -n '1p'`
fileName=$(basename $fullfile )
if [[ "$fileName" =~ 9[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\-.*\.txt ]];then
 echo do nothing
else
 exit 0
fi
程式繼續......

另一種寫法,還沒空試,先記下來

# GLOB matching
gg=svm-grid-ch    
case "$gg" in
   *grid*) echo $gg ;;
esac

# REGEXP    
if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi    

# Extended REGEXP
if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then
  echo $gg
fi    

Some grep incarnations also support the -q (quiet) option as an alternative to redirecting to /dev/null, but the redirect is again the most portable.

[note]參考資料:stackOverFlow
google關鍵字:shell script regular expression match if
[/note]

]]>
https://blog.vic.mh4u.org/2015/1477/feed 0
陣列應用 https://blog.vic.mh4u.org/2015/1463 https://blog.vic.mh4u.org/2015/1463#respond Thu, 02 Jul 2015 09:37:31 +0000 http://blog.vic.mh4u.org/?p=1463 閱讀全文 ]]> 底下介紹陣列應用的一個簡單範例

[tip]重點語法提醒:
declare -a 變數
變數=(`cat $檔名`)
透過上面的語法,就可很快的用cat 檔案的方法,將檔案內容塞入陣列裡
[/tip]

#!/bin/bash
#說明: 主叫號碼.txt 此檔的內容是一行一個手機號碼,有很多個手機號碼
#使用 `cat 主叫號碼.txt` 方式將內容填入陣列裡
#再用迴圈的方式依序將陣列的內容列出


#假設 /home/ftp/autorun/ 此資料夾底下有很多個 .txt 檔,使用 sed -n '1p' 只列出第1個檔案
fullfile=`find /home/ftp/autorun/*.txt |sed -n '1p'`
#去掉完整的路徑,只取檔案名稱
fileName=$(basename $fullfile )
#檔案名稱 再去掉副檔名 .txt 只取主檔名
callerID=$(basename $fullfile .txt )

#宣告底下變數為陣列
declare -a cellphoneNUM
cellphoneNUM=(`cat $fullfile`)

#列出陣列裡的所有資料
#echo "${cellphoneNUM[*]}"
#計算陣列裡共有幾筆資料
#echo "${#cellphoneNUM[*]}"

#底下開始使用陣列帶出call file
for item in ${cellphoneNUM[*]}
do
 #依序列出陣列內容,你可在此再加一些指令動作
 echo $item
done

在以上的基礎我們加些功能

#!/bin/bash
fullfile=`find /home/ftp/autorun/*.txt |sed -n '1p'`
callerID=$(basename $fullfile .txt )
#宣告底下變數為陣列
declare -a cellphoneNUM
cellphoneNUM=(`cat $fullfile`)


#底下開始使用陣列帶出call file 於 /tmp/t 底下
for item in ${cellphoneNUM[*]}
do
 echo "Channel: SIP/router/prefix886$item" > /tmp/t/test$item.call
 echo "CallerID:\"$callerID\" <$callerID> " >> /tmp/t/test$item.call
 echo 'Context: IVR1' >> /tmp/t/test$item.call
 echo 'Extension: s' >> /tmp/t/test$item.call
 echo 'Priority: 1' >> /tmp/t/test$item.call
done

]]>
https://blog.vic.mh4u.org/2015/1463/feed 0
迴圈應用 https://blog.vic.mh4u.org/2014/1392 https://blog.vic.mh4u.org/2014/1392#respond Tue, 19 Aug 2014 08:34:10 +0000 http://blog.vic.mh4u.org/?p=1392 閱讀全文 ]]> 有檔名如下,要按檔名順序依次copy進mp3隨身碟撥放器裡面去

0160.0160 第二届01.wav
0161.0161 第二届02.wav
0162.0162 第二届03.wav
0163.0163 第二届04.wav
0164.0164 第二届05.wav
…..
…..
0181 第三届09.wav
0182 第三届09.wav
….
0250 第三届09.wav

以上檔名中間有空隔,數字前面有個0

程式所要得到的結果是就可以從0160*.wav 一直copy到 0250*.wav 按檔名順序依次copy進mp3撥放器裡去。
一般的copy指令未必能按檔名順序依次copy進隨身碟,故要特地寫此腳本。

#!/bin/bash
file=/home/user/temp
dst=/tmp

for (( i=160; i<=251; i=i+1 ))
do
cp $file/0$i*.wav $dst
done

#for ((index=0; index<10; index++)); do
#   echo "Hello, this is : $index"
#done

語法說明:上面for的迴圈是以一種類似 C 語言的那種運作方式,

上面那個迴圏還有另一種更精簡的寫法

#!/bin/bash
file=/home/user/temp
dst=/tmp

for i in $(seq 160 251)
do
cp $file/0$i*.wav $dst
done

此範例的重點在 $(seq ..) 那個位置!那個 seq 是連續 (sequence) 的縮寫之意!代表後面接的兩個數值是一直連續的! 如此一來,就能夠輕鬆的將連續數字帶入程式中囉!

無限迴圈寫法

while (true)
do
...
done
for ((;;)){
...
}
]]>
https://blog.vic.mh4u.org/2014/1392/feed 0
luks掛載腳本 https://blog.vic.mh4u.org/2014/1343 https://blog.vic.mh4u.org/2014/1343#respond Sun, 29 Jun 2014 09:34:20 +0000 http://blog.vic.mh4u.org/?p=1343 閱讀全文 ]]> 使用luks加密碟掛載時要重覆打一堆指令,很花時間,因此我就寫了個腳本,省去了打這些指令的時間…
若你還不知怎樣創建一個加密碟的話,請參照我這篇文章,先使用指令建立好加密碟之後再回頭來看我這篇文章。

底下這個腳本能協助你快速的掛載、卸載加密碟,相信能省去你不少時間

系統與桌面環境建議:Linux mint、mate

使用前請先調整裡面的變數設定

#!/bin/bash
#作者:夢見草 製作日期:2014/07/04 更新日期:2015/09/21
#系統需求:zenity、cryptsetup。該帳號必須要能使用sudo,並事先設好不問密碼。mkdir /mnt/luks
#簡要說明:此為gui介面幫你掛載、卸載luks加密碟,需自行準備好加密碟和掛載路徑,掛載時會跳出視窗來詢問密碼,輸錯密碼會跳出提示視窗,靜待3秒後就可再次輸入密碼,若在這3秒內按下enter則會離開程式.

################################變數定義###################
#請輸入你的加密碟所在位置
LUKS="/home/user/file.luks"
#自動尋找一個未使用的loop
#LOOP_DEV=$(sudo losetup -f)
#若只掛一個加密碟用上面的指令容易出錯,因此改用下面的指令比較不容易出錯。
LOOP_DEV=/dev/loop0
#使用者帳號與群組
USER=user
GROUP=user
#設定加密碟要掛載的路徑
MOUNTPATH=/mnt/luks

################################變數定義###################


CHOOSE=$(zenity --list --height=250 --text "請選擇你需要的功能:" --radiolist --column "功能" --column "說明" TRUE 1:掛載加密碟 FALSE 2:卸載加密碟|cut -d ':' -f 1)
#底下是比較精簡的寫法
#CHOOSE=$(zenity --list --column "LUKS加密碟" "load:掛載加密碟" "unload:卸載加密碟"|cut -d ':' -f 1)

case $CHOOSE in

1)
	sudo losetup $LOOP_DEV $LUKS
	PSWD=$(zenity --entry --title=LUKS --text=請輸入掛載密碼 --hide-text)
	echo -e "$PSWD\n" |sudo cryptsetup luksOpen $LOOP_DEV luks
	#底下的 until 是檢查密碼是否有輸錯誤, 輸錯密碼則 $? =\= 0
	#因為必須要先執行過一次問密碼的動作,後面才能判斷回傳值是否輸入正確
	until  [ $? = 0 ]; do #若密碼輸錯,則重覆執行這個迴圈
	 PSWD=$(zenity --entry --title=LUKS --text=密碼輸錯了,請再次輸入掛載密碼 --hide-text)
	 echo -e "$PSWD\n" |sudo cryptsetup luksOpen $LOOP_DEV luks
		#密碼輸錯則重覆跳出輸入視窗
		if [  $? != 0 ] ; then
		zenity --error --title=密碼錯誤 '--text=3秒後重新輸入密碼!\n或按enter離開!' --timeout=3
		fi
	done
		#底下是密碼輸對之後接著掛載的動作
		sudo mount /dev/mapper/luks $MOUNTPATH
		sudo chown $USER.$GROUP $MOUNTPATH
		zenity --info --title=LUKS --text=加密碟掛載成功! --timeout=3
		sleep 3
		caja $MOUNTPATH

        ;;
2)
	#卸載加密碟
        sudo umount $MOUNTPATH
        sudo cryptsetup luksClose /dev/mapper/luks
        sudo losetup -d /dev/loop0
	zenity --info --text=已卸載加密碟 --timeout=3
        ;;
esac


此腳本執行後的效果圖如下
zenity2

使用以上腳本之後,你可在桌面建立一個啟動圖示,方便你快速的執行此腳本
滑右鍵點桌面→新增啟動圖示→指令的部份請填 bash /home/user/luks.sh
意即你這個腳本的檔案名稱,前面再加一個bash
再搭配以下圖示,就很好用了
lock-folder

lock-folder2

]]>
https://blog.vic.mh4u.org/2014/1343/feed 0
bash更改行列順序 https://blog.vic.mh4u.org/2013/1110 https://blog.vic.mh4u.org/2013/1110#respond Wed, 16 Oct 2013 07:41:10 +0000 http://blog.vic.mh4u.org/?p=1110 閱讀全文 ]]> 目地:由於修改asterisk設定檔內的路由順序的次數很頻繁,因此就寫了一個小程式來協助完成此工作

asterisk 的設定檔如下:

[outbound-route]
exten => s,1,Noop()
;設定動態功能鍵 Set(DYNAMIC_FEATURES=vicGroup)
exten => s,n,set(_MainRoomNum=${CALLERID(number)})
  same => n,Gosub(設定來電顯示,cell${RAND(4,9)},1)
  same => n,Dial(SIP/路由1/235${x},32,gCX)
  same => n,Dial(SIP/路由2/7852${x},32,gCX)
  same => n,Dial(SIP/路由3/9957${x},32,gCX)
  same => n,Dial(SIP/路由4/9967${x},32,gCX)
  same => n,Dial(SIP/路由5/9867${x},32,gCX)
  same => n,Return

希望透過使用者按簡單的數字來改變路由順序,而不改動到其它的字。
比如說:當我按下3之後,內容會變成這樣,路由3跑到第1行去了,其它行則不動。

[outbound-route]
exten => s,1,Noop()
;設定動態功能鍵 Set(DYNAMIC_FEATURES=vicGroup)
exten => s,n,set(_MainRoomNum=${CALLERID(number)})
  same => n,Gosub(設定來電顯示,cell${RAND(4,9)},1)
  same => n,Dial(SIP/路由3/9957${x},32,gCX)
  same => n,Dial(SIP/路由1/235${x},32,gCX)
  same => n,Dial(SIP/路由2/7852${x},32,gCX)
  same => n,Dial(SIP/路由4/9967${x},32,gCX)
  same => n,Dial(SIP/路由5/9867${x},32,gCX)
  same => n,Return

需注意的是,此設定檔內有許多特殊符號,如大於、等號、空格…等,因此會使得變數在處理上變得很麻煩、困難重重。

針對以上需求,寫出了兩個版本的shell script。

第1個版本,使用sed本身強大的功能,透過一些複雜的參數,實現了兩行資料直接對換的功能。此版本得以實現是完全參照此頁所寫出來的。

#!/bin/bash
file="outbound.conf"
old=$IFS
IFS=' '
#此行將檔案內容存入變數
content=$(cat $file)
#計算有 Dial 這樣的字串有幾行
length=$(echo $content | grep -o 'Dial' | wc -l)
#計算 Dial 這樣的字串 第一次出現時是位於第幾行
mainroute=$(echo $content | grep -n 'Dial' | head -n1 | cut -d ':' -f1)
headlength=$(( $mainroute -1 ))
IFS=$old
#echo $length

echo "目前路由順序如下:"
echo "$content" |grep Dial |nl
#grep Dial $file|nl -v0
echo "  參照上方的路由表輸入你要設定主要路由的號碼"
read -p "  請輸入數字(1,2,3,4...):" num

echo ""
if [ "$mainroute" -eq "$(($num+$headlength))" ]; then
echo "已經是主要路由了"
exit 0
fi
echo " "
echo "底下是修改後的路由表"
#sed -n "$mainroute! {p;d};:1;$(($num+$headlength-1))! {N;b1};h;n;p;g;p" $file
sed -ni "$mainroute! {p;d};:1;$(($num+$headlength-1))! {N;b1};h;n;p;g;p" $file
grep Dial $file|nl

/usr/sbin/asterisk -r -x "reload"
echo "路由變更完成"


#line=3
#cat bound.conf  | sed -n "6! {p;d};:1;$(($line+5-1))! {N;b1};h;n;p;g;p"
#說明:  此指令為兩行資料互相對調, 6!  代表你要修改的那一行  $line 代表另一行

第2個版本,主要使用陣列,加上簡單的sed功能實現:

#!/bin/bash
IFS=$'\n'
#由於我們所使用的變數內容內含空格 如:same => n,Dial(SIP/路由/5131${x},32,gCX)
#這樣在我們將此變數塞入陣列時容易出錯,因為空格的關係,此變數會被塞進3個陣列元素之中
#所以我們要更改 IFS 預設的分隔符號為換行符號 $'\n\ 這樣它才能將整行(內含空格)的變數塞入同一個陣列元素之中
#IFS 中的第一個預設字符來作為每個位置參數之間的分隔符號,而這個預設字符通常為空白字元
#參考資料:http://www.suse.url.tw/sles10/lesson10.htm

#定義變數
file1=./outbound.conf
#此行將檔案內容存入變數
content=$(cat $file1)
last=(`tail -n1 $file1`)
#計算 Dial 這樣的字串 第一次出現時是位於第幾行
#mainroute=$(cat $file1 | grep -n 'Dial' | head -n1 | cut -d ':' -f1)

echo "目前路由順序如下:"
echo "$content" | grep Dial |nl -v0

#宣告陣列 route1,並將路由分別資料存入陣列之中
declare -a route1=(`echo "$content" | grep Dial`)
declare -a route2
read -p "請輸入數字(1,2,3...):" keyin
#將使用者所選的路由存到陣列 route2 裡的第0個元素去
route2[0]=${route1[$keyin]}
#將陣列 route1 裡的資料分別存入 陣列 route2
#特別注意的是 route2[0] 裡面的資料剛剛已經存入了使用者所選擇的路由,所以要從 route2[1]開始存放
#即按 route1[0]=route2[1]  這樣的方式存入
#而陣列 route1[*] 裡的資料又不能全存入,得剔掉使用者所選的那個路由,是變數 $keyin
for (( i=0; i<=${#route1[@]}-1; i=i+1 ))
do
      if [ $i != $keyin ]; then route2[$i+1]=${route1[$i]}
      fi
done
#echo print array 所有內容
#echo  "${route2[*]}"
#echo 計算 array 總數
#echo  "${#route2[@]}"
#echo print 陣列元素 2
#echo "${route2[2]}"

#刪除從 Dial 這行開始後面的所有資料
sed -i '/Dial/,$d' $file1 
#底下是使用另一種刪除法,從主要路由哪一行開始,刪除後面所有資料
#sed -i ''$mainroute',$d' $file1
#sed 注意事項: 若要在 sed 內使用變數,請在變數左右加單引號

#開始注入新的路由資料,即 route2[*] 的內容倒回原設定檔內
for item in ${route2[*]}
  do
  echo $item >> $file1
done
#注入最後一行資料
echo $last >> $file1
#顯示修改結果
echo ""
echo "路由更新結果如下:"
grep Dial $file1 |nl -v0
/usr/sbin/asterisk -r -x "reload"
echo "路由變更完成"

程式設計的思惟:
第1步將路由資料存入陣列route1之中
第2步讓使用者選擇某一個路由,再將使用者所選的路由存入陣列route2的第0個元素之中。
第3步將route1陣列裡的資料,存入route2陣列中
第4步刪除原設定檔內的路由資料,開始注入route2的內容
第5步reload asterisk

此程式最困難的地方在於變數的處理,由於路由資料那一行內含有一些特殊符號,使得路由資料轉為變數存入陣列時有很多問題要克服,而好不容易存入陣列中了,要讀出來的時候,所有的陣列元素全部變成只有一行輸出,而不是我想要的一個路由資料就是一行,因此在解決這些問題上面花了不少時間,這也才明白了 bash 對於程式的語法要求是很嚴格的,差一點都不行的。

]]>
https://blog.vic.mh4u.org/2013/1110/feed 0
檢查網路連線狀況 https://blog.vic.mh4u.org/2013/1051 https://blog.vic.mh4u.org/2013/1051#respond Thu, 04 Jul 2013 06:24:43 +0000 http://blog.vic.mh4u.org/?p=1051 閱讀全文 ]]>
有時候我們會遇到網路連線狀況不好,時不時偶爾給你斷線一下之後又自動恢復,這種情況最難處理,而且你根本沒辦法了解到網路斷線的狀況到底有多嚴重、它斷多久之後又恢復了,所以這時我們就需要寫一個小程式去監控網路狀況,看它一天中到底斷了幾次。

vim lineCheck.sh

#!/bin/bash
#作者:夢見草 2013年07月04日
#簡介:檢測網路是否有斷線,ping 3600 秒為一小時,每小時產生一個檔,檔名後面會押時間
#請將 a2 改成你要 ping 的 IP 或主機名稱
date1=`date +%Y/%m/%d,%T`
date2=`date +%m%d%H`
result=/home/user/a2Ping$date2.txt
#以上為變數設定 date2 為" 月日小時" 的變數,加在檔名後面
echo "---------------------------------------------" >> $result
#押日期
echo 日期: $date1 >>  $resul
#ping 86400 秒,為一天
#ping -qc 86400 168.95.1.1 >> $result
ping -qc 3600 a2 >> $result

排程每個小時自動執行一次
sudo vim /etc/crontab

#每一小時執行一次底下的網路狀況檢查程式
* */1	* * *	user	/home/user/script/lineCheck.sh

若你要改成ping 一天的話,注意將 ping -qc 3600 那行註解掉。排程時間也要改為一天。

]]>
https://blog.vic.mh4u.org/2013/1051/feed 0
搜尋、刪除整行資料 https://blog.vic.mh4u.org/2012/962 https://blog.vic.mh4u.org/2012/962#respond Fri, 14 Sep 2012 06:39:47 +0000 http://blog.vic.mh4u.org/?p=962 閱讀全文 ]]> 嗯,在linux底下,要搜尋某一字串,並刪除整行資料有兩個做法

1 使用 sed 工具

指令格式 sed -in ‘/要搜尋的字串/d’ 檔案名稱
注意, sed 不同的版本,參數也不同,有的版本不要加 -n

例:
sed -in ‘/VERBOSE\[15687\]/d’ messages.log

指令說明: 刪除 VERBOSE[15687] 有這樣字串的那一整行資料, messages.log 是檔案名稱
由於搜尋是正規表示法,所以需要規避特殊符號所以在 [] 的前面都加了 \

補充說明:若是已確定你要編輯的資料是在第幾行的話,你可使用底下指令

刪除檔內第 10 行資料 , 則指令為 10d。
刪除含有 “man” 字串的資料行時 , 則指令為 /man/d。
刪除檔內第 10 行到第 200 行資料, 則指令為 10,200d。
刪除檔內第 10 行到含 “man” 字串的資料行 , 則指令為 10,/man/d。

含有 “Dial” 字串資料的那一行開始,後面的資料全刪除
sed ‘/Dial/,$d’ 檔案

$ 在 sed 裡代表著最後一行

從某一行,刪到最後一行
sed ‘6,$d’ 檔名

搜尋FALSE取代成TRUE
sed ‘s/FALSE/TRUE/g’

2 使用 vim 工具

指令 :g/你要搜尋的字串/d

指令說明: 開頭的g是表所有的意思,尾巴的d則是刪除,中間被/包圍的則是要搜尋的字這是允許regex的。

[note]參考資料: Rickey’s pet sblog鳥哥、[/note]

]]>
https://blog.vic.mh4u.org/2012/962/feed 0
pdftotext批次轉檔 https://blog.vic.mh4u.org/2012/722 https://blog.vic.mh4u.org/2012/722#respond Tue, 10 Jul 2012 09:50:16 +0000 http://blog.vic.mh4u.org/?p=722 閱讀全文 ]]>

pdftotext 此程式就是能將 pdf 檔轉為純文字檔
但似乎沒有提供批次轉檔的功能,因此我寫了個 shell script 來批次轉檔

指令範例:
pdftotext -raw 123.pdf 123.txt

#!/bin/bash
#作者:夢見草	版本:2012年07月10日 (週二) 15時56分32秒
#簡介:本程式搭配 pdftotext 程式,批次轉檔為 text
#使用說明:
#1 請在本程式所在位置底下建兩個資料夾 pdf 和 txt
#2 將 *.pdf 檔案放入 pdf 資料夾,然後運行此程式,就可到 txt 資料夾去取檔
#3 以上兩個動作請確切完成之後才能執行本程式

#宣告底下兩個變數為陣列
typeset -a PdfFilename
typeset -a TxtFilename


chmod 664 pdf/*.* > /dev/null
#拿掉檔案的 x 權限。若不拿掉的話,在某些系統 ls 時,檔名後會加 * 號

PdfFilename=(`ls -1 pdf`)
#將 pdf 此資料夾內的檔名 存入陣列之中,此陣列名為 PdfFilename
TxtFilename=(`ls -1 pdf | sed 's/\.pdf/\.txt/g'`)
#將 *.pdf 改名為 *.txt,存入陣列之中,此陣列名為 TxtFilename

#echo "${TxtFilename[*]}"
#列出陣列裡的所有資料
#echo "${#TxtFilename[*]}"
#echo "${#PdfFilename[*]}"
#計算陣列內共有幾筆資料

arrayNum=${#PdfFilename[*]}
#計算陣列內共有幾筆資料,並設定變數 arrayNum 為陣列內的總數

set -x
for (( i=0; i<$arrayNum; i=i+1))
#for (( 初始值; 限制值; 執行步階 ))
do
	pdftotext -raw pdf/${PdfFilename[i]} txt/${TxtFilename[$i]}
done
set +x

[note]
參考資料:ubuntu Manpage
[/note]

]]>
https://blog.vic.mh4u.org/2012/722/feed 0