The poor starve while the rich feast.git
"窮人飢腸轆轆,富人大吃大喝"正則表達式
參考資料:鳥哥的Linux私房菜 基礎學習篇(第三版) shell
1、簡易單詞管理程序bash
簡介: 本程序主要用於記錄和查詢英文單詞信息,可能沒有什麼實際用途,也可能代碼中有一些不太簡潔的實現,主要是由於編寫本程序的目的是爲了熟練一下shell script編程的基礎知識ide
功能: ①單詞查詢; ②單個單詞導入詞庫; ③從文件導入詞庫;④統計詞庫信息;函數
程序結構: 一個Bash shell程序 explain (解釋), 一個詞庫文件: .word_lib.txt , 保存在用戶家目錄下的 .word_manager 目錄中學習
文件內容: .word_lib.txt 是詞庫文件,保存全部單詞信息, 每行一個單詞, 包括: 原型, 中文意思。全部單詞信息已通過排序去重處理; spa
程序執行流程: 解析命令選項-->根據解析結果執行對應的操做-->退出程序
程序介紹:
1 用法: explain [-afcb] [單詞|文件名] [單詞信息] 2 選項: 3 不帶選項: 查詢單詞並打印出查詢結果,結果格式: word 中文意思 4 -a : 將單詞信息導入詞庫,後跟單詞和單詞信息 5 -f : 從文件導入詞庫,後跟文件名 6 -c : 統計詞庫中的單詞總數 7 -b : 瀏覽詞庫的單詞信息(經過more命令打開)
8 全部正確的命令格式: 9 explain word #查詢word指定的單詞 10 explain -c #打印出詞庫當前共有多少個單詞 11 explain -b #瀏覽詞庫的單詞信息 12 explain -a word wordinfo #添加單詞信息至詞庫 13 explain -f filename #將文件導入詞庫,要求格式一致 14 15 說明:word能夠爲英文單詞,也能夠爲中文,只要詞庫中某一行包含word,就會打印出該行,因此查詢結果可能包含多行
16 退出碼: 17 0 :程序執行成功 18 1 :沒有輸入選項和參數 19 2 :輸入了未知的選項 20 3 :-a後面沒有跟着單詞和解釋 21 4 :-f後面沒有文件名或者是不存在的文件
源碼以下:
1 #/bin/bash - 2 #=============================================================================== 3 # 4 # FILE: explain.sh 5 # 6 # USAGE: ./explain.sh 7 # 8 # DESCRIPTION: 簡易單詞管理程序 9 # 10 # OPTIONS: --- 11 # REQUIREMENTS: --- 12 # BUGS: --- 13 # NOTES: --- 14 # AUTHOR: Aut (yinjing), autyinjing@126.com 15 # ORGANIZATION: 16 # CREATED: 2015年06月29日 16:23 17 # REVISION: --- 18 #=============================================================================== 19 20 # 1 可執行文件的查找路徑設置 21 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 22 export PATH 23 24 # 2 相關的全局變量聲明和設置 25 home_path=~/.word_manager #相關文件的主目錄 26 lib_path=$home_path/.word_lib.txt #詞庫文件的路徑 27 28 # 3 相關目錄和文件的設置 29 if [ ! -d "$home_path" ]; then 30 mkdir $home_path #~/.word_manager 31 touch $lib_path #~/.word_manager/.word_lib.txt 32 fi 33 34 # 4 相關函數實現 35 function query() #直接查詢單詞信息 36 { 37 ret=$(cat $lib_path | grep "$1") 38 if [ -z "$ret" ]; then 39 echo "$1 not be found!" 40 else 41 echo "$ret" 42 fi 43 } 44 45 function update_lib() #對詞庫進行排序去重,目前尚未想到更好的方法,只能利用臨時文件 46 { 47 cat $lib_path | sort -fb | uniq > ~/.word_manager/._word_lib.txt 48 rm $lib_path 49 mv ~/.word_manager/._word_lib.txt $lib_path 50 } 51 52 function print_count() 53 { 54 ret=$(wc -l $lib_path | cut -d ' ' -f1 | grep '[[:digit:]]') 55 echo "當前詞庫共有$ret個單詞" 56 } 57 58 function add_to_lib() #添加單詞到詞庫 59 { 60 word=$1\ $2 #將新的單詞信息保存爲一整行 61 echo "$word" >> $lib_path #~/.word_manager/.word_lib.txt 62 update_lib 63 echo "成功將 $word 導入詞庫!" 64 print_count 65 } 66 67 function add_from_file() #經過文件導入詞庫 68 { 69 cat $1 >> $lib_path #~/.word_manager/.word_lib.txt 70 update_lib 71 echo "成功將 $1 內的單詞導入詞庫!" 72 print_count 73 } 74 75 function browse_lib() 76 { 77 echo "" 78 more $lib_path 79 echo "" 80 print_count 81 } 82 83 function print_help() 84 { 85 echo "" 86 echo "用法: explain [選項] [單詞|文件名] [單詞信息]" 87 echo "" 88 echo "選項:" 89 echo " 不帶選項: 查詢單詞並打印出查詢結果" 90 echo " -a : 將單詞信息導入詞庫,後跟單詞和單詞信息" 91 echo " -f : 從文件導入詞庫,後跟要導入的文件名" 92 echo " -c : 統計詞庫中的單詞總數" 93 echo " -b : 瀏覽詞庫中單詞信息" 94 echo " --help : 顯示幫助信息" 95 echo "" 96 } 97 98 # 5 主程序部分 99 if [ "$#" -lt 1 ]; then #首先判斷命令格式是否正確 100 print_help 101 exit 1 102 fi 103 104 opt=$(echo $* | cut -d ' ' -f1 | grep '^-') #解析選項 105 case $opt in 106 "") 107 query $1 108 ;; 109 "-a") 110 if [ "$#" -eq "3" ]; then 111 add_to_lib $2 $3 112 else 113 echo "正確格式:explain -a word wordinfo" 114 exit 3 115 fi 116 ;; 117 "-f") 118 if [ -f "$2" ]; then 119 add_from_file $2 120 else 121 echo "不存在的文件 $2" 122 exit 4 123 fi 124 ;; 125 "-c") 126 print_count 127 ;; 128 "-b") 129 browse_lib 130 ;; 131 "--help") 132 print_help 133 ;; 134 *) 135 echo "未知的選項,輸入 explain --help 查看幫助信息" 136 exit 2 137 esac 138 139 exit 0
使用截圖以下,筆者已增長了文件的可執行權限並複製到/usr/bin/,因此能夠直接輸入程序名來執行命令
空的詞庫:(不知道爲何圖片和文字之間的間隔那麼大,並無空行~~)
添加單個單詞:
從文件導入詞庫:
查詢:
篇幅有限,錯誤的命令提示就不發圖了
2、迴文串檢測程序
程序說明:本程序用於檢測一個文件內的迴文單詞,並將全部迴文單詞按照每一個一行的格式打印出來
1 用法:match_plalindrome filename 2 輸出:按照單詞長度遞增的順序打印出全部的迴文單詞(默認檢測長度在3~20之間的單詞) 3 核心思想:用正則表達式中的'(.)'匹配任意字符,再用反向引用 '...\2\1' 匹配前面的任意字符達到檢測迴文串的目的,詳細內容參見下面源碼 4 說明:程序默認將 空格、,、.、?、:、! 做爲單詞分隔符
程序源碼:
1 #!/bin/bash - 2 #=============================================================================== 3 # 4 # FILE: match_plalindrome.sh 5 # 6 # USAGE: ./match_plalindrome.sh 7 # 8 # DESCRIPTION: 9 # 10 # OPTIONS: --- 11 # REQUIREMENTS: --- 12 # BUGS: --- 13 # NOTES: --- 14 # AUTHOR: Aut (yinjing), autyinjing@126.com 15 # ORGANIZATION: 16 # CREATED: 2015年06月30日 19:13 17 # REVISION: --- 18 #=============================================================================== 19 20 # 1 判斷命令格式是否正確 21 if [ "$#" -ne 1 ]; 22 then 23 echo "Usage: $0 filename" 24 exit 1 25 fi 26 27 # 2 全局變量的聲明和設置 28 filename=$1 #要查找的文件名 29 tmpfile=tmp.txt #臨時文件的文件名 30 declare -i count #迴文串的重複部分長度 31 32 # 3 因爲原文件中的內容可能不是每行一個單詞,因此這裏要使用一個臨時文件將原文件的信息轉換爲每行一個單詞 33 cat $filename | tr '[ ,.?:!]' '\n' > $tmpfile #將全部的標點符號及空格替換爲換行符 34 sed -i '/^$/d' $tmpfile #刪除全部空行 35 36 # 4 默認查找長度爲3到20的迴文串 37 for ((len=3; len<=20; len++)) #循環查找各個長度的迴文串 38 do 39 basepattern='/^\(.\)' #基礎模式 40 count=$(( $len / 2 )) #計算重複部分的長度 41 42 for ((i=1; i<$count; i++)) #設置正則表達式 43 do 44 basepattern=$basepattern'\(.\)' 45 done 46 47 if [ $(( $len % 2 )) -ne 0 ]; #判斷字符串長度是奇數仍是偶數並設置對稱軸 48 then 49 basepattern=$basepattern'.' 50 fi 51 52 for ((count; count>0; count--)) #設置反向引用 53 do 54 basepattern=$basepattern'\'"$count" 55 done 56 57 basepattern=$basepattern'$/p' #添加打印參數 58 59 sed -n "$basepattern" $tmpfile 60 done 61 62 # 5 刪除臨時文件 63 rm $tmpfile 64 65 exit 0
運行截圖:
3、其餘命令(持續更新...)
一、用awk實現head
1 $ awk 'NR <= 10' filename 2 說明:打印行號小於等於10的行
二、用awk實現tail
1 $ awk '{ buffer[NR % 10] = $0; } END { for (i=1;i<11;i++) { print buffer[i%10] } }' filename 2 說明:用數組保存文件的最後10行,而後打印
三、用awk實現tac
1 $ awk '{ buffer[NR] = $0; } END { for (i=NR; i>0; i--) { print buffer[i] } }' 2 說明:順序保存,而後逆序打印
總結:剛開始學寫腳本,感受一切好神奇,實現一點簡單的功能都好牛X,呵呵~~之後必定多多加油