shell基本命令for循環(huán)數(shù)學計算邏輯表達式數(shù)學表達式的計算數(shù)組的基本操作文本操作cut命令head命令tr命令sort命令uniq命令paste命令awk和sed命令使用awk命令sed命令grep命令
for循環(huán)輸出1,3,5,7,9…97,99
for((i=1;i<100;i+=2))do echo $i;done//更喜歡這種for循環(huán)計算從控制臺讀取的兩個數(shù)的和、差、積和商 算術(shù)運算有三種方式:使用 exPR 外部程式、使用
if else條件判斷表達式,比較從控制臺輸入的兩個整數(shù)的大小
read xread yif [ $x -gt $y ]; thenecho "X is greater than Y"elif [ $x -lt $y ]; thenecho "X is less than Y"elseecho "X is equal to Y"fi//要注意在'['后面和']'前面都必須要有空格;判斷字符串的是否相等
read chif [ $ch = 'Y' -o $ch = 'y' ]; thenecho "YES"elseecho "NO"fi//字符串判斷用"="判斷兩個字符串是否相等,而不是"==";判斷三角形的形狀:等邊、等腰或不等邊
read aread bread cif [ $a = $b -a $a = $c -a $b = $c ]; thenecho "EQUILATERAL"elif [ $a = $b -o $a = $c -o $b = $c ]; thenecho "ISOSCELES"elseecho "SCALENE"fi//使用-o或-a來連接不同的邏輯判斷條件字符串判斷 [ -z str ] 如果str的長度為零則返回為真,即空是真 [ str ] 如果字符串不為空則返回為真,與-n類似 [ str1 = str2 ] 如果兩個字符串相同則返回為真 [ str1 != str2 ] 如果字符串不相同則返回為真 [ str1 < str2 ] 如果 str1字典排序在str2前面則返回為真。
數(shù)值判斷 [ num1 -eq num2 ] 等于 [ num1 -ne num2 ] 不等 [ num1 -gt num2 ] 大于 [ num1 -ge num2 ] 大于等于 [ num1 -lt num2 ] 小于 [ num1 -le num2 ] 小于等于
邏輯判斷 [ ! EXPR ] 邏輯非 [ EXPR1 -a EXPR2 ] 邏輯與 [ EXPR1 -o EXPR2 ] 邏輯或 [ ] || [ ] 用OR來合并兩個條件 [ ] && [ ] 用AND來合并兩個條件
計算輸入的數(shù)學表達式的值
read str //從控制臺讀取數(shù)學表達式printf "%.3f" $(echo $str | bc -l) //計算數(shù)學表達式 //"%.3f"輸出浮點數(shù),在小數(shù)點第三位進行四舍五入//echo $str | bc -l 計算數(shù)學表達式,如echo "5/3" | bc -l,輸出1.66666666666666666666從控制臺讀取一定數(shù)目的數(shù)字,然后計算器平均值
read countsum=0for((i=0;i<count;i++))doread numsum=$((sum+num))doneprintf "%.3f" $(echo "$sum/$count" | bc -l)count用來表示讀取數(shù)字的數(shù)量,sum表示和,然后通過echo “
1.將多行文本合并為一行
i=0while read linedoarr[$i]=$line((i++))doneecho ${arr[@]} //echo ${arr[@]}輸出所有的數(shù)組元素**Input**NamibiaNauruNepalNetherlandsNewZealandNicaraguaNigerNigeriaNorthKoreaNorway**Output**Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway2.將包含‘a(chǎn)’字母的文本行刪掉
i=0while read linedoarr[$i]=$line((i++))doneecho ${arr[@]/*[aA]*/}**Input**NamibiaNauruNepalNetherlandsNewZealandNicaraguaNigerNigeriaNorthKoreaNorway**Output**Niger**Output2**echo ${arr[@]/*[aA]*/hello} //使用hello替換掉所有包含a的文本行hello hello hello hello hello hello Niger hello hello hello3.將上述輸入文本重復(fù)輸出三次
X=$(paste -sd' ' fileName)echo $X $X $XX=$(cat fileName)echo $X $X $X**Output**Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway4.輸出某個元素
echo ${arr[3]}5.統(tǒng)計輸入文本有多少行
a.使用wc命令wc -lb.使用echo命令arr=($(cat))echo ${#arr[@]}c.使用for循環(huán)i=0while read linedoarr[$i]=$line((i++))doneecho "$i"6.將每行第一個大寫字母替換為.
a.使用sed命令僅替換第一個大寫字母為.sed 's/[A-Z]/./' | paste -sd ' 'b.使用數(shù)組的替換來實現(xiàn)X=($(cat)) echo "${X[@]/[A-Z]/.}"**Output**.amibia .auru .epal .etherlands .ewZealand .icaragua .iger .igeria .orthKorea .orway7.找出一組數(shù)據(jù)中落單的數(shù)
a.首先將' '替換為換行,然后對每行數(shù)據(jù)排序,獲取只出現(xiàn)一次的數(shù)字tr ' ' '/n' | sort | uniq -u獲取每行的第三個字母
cut -c3 fileName獲取每行的第三至第五個字母
cut -c3-5 fileName獲取每行的第三和第五個字母
cut -c3,5 fileName獲取每行的前三個字母
cut -c-3 fileName獲取每行的第五個字母往后的字母
cut -c5- fileName獲取文本中的前三個字段
cut -f1-3 fileName //默認的文本分隔符為/t//輸入1 New York, New York[10] 8,244,910 1 New York-Northern New Jersey-Long Island, NY-NJ-PA MSA 19,015,900 1 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 22,214,0832 Los Angeles, California 3,819,702 2 Los Angeles-Long Beach-Santa Ana, CA MSA 12,944,801 2 Los Angeles-Long Beach-Riverside, CA CSA 18,081,5693 Chicago, Illinois 2,707,120 3 Chicago-Joliet-Naperville, IL-IN-WI MSA 9,504,753 3 Chicago-Naperville-Michigan City, IL-IN-WI CSA 9,729,8254 Houston, Texas 2,145,146 4 Dallas-Fort Worth-Arlington, TX MSA 6,526,548 4 Washington-Baltimore-Northern Virginia, DC-MD-VA-WV CSA 8,718,0835 Philadelphia, Pennsylvania[11] 1,536,471 5 Houston-Sugar Land-Baytown, TX MSA 6,086,538 5 Boston-Worcester-Manchester, MA-RI-NH CSA 7,601,061//輸出1 New York, New York[10] 8,244,9102 Los Angeles, California 3,819,7023 Chicago, Illinois 2,707,1204 Houston, Texas 2,145,1465 Philadelphia, Pennsylvania[11] 1,536,471獲取輸入文本的第四個字段
cut -d' ' -f4 fileName**input**HelloWorldhow are you**output**HelloWorld//輸入的三行最大字段都不超過4個,為什么只輸出Hello和World呢?這題不太靠譜輸出某個字段或字段范圍和輸出某個字母或字符范圍類似,不再重復(fù)
輸出前20行
head -n20 fileName //不存在20行的話有多少行算多少行輸出第11到第20行
head -n20 fileName | tail -n10輸出前20個字符
head -c20 fileName //不存在20個字符的話有多少算多少輸出后20行
tail -n20 fileName //不存在20行的話有多少行算多少行輸出后20個字符
tail -c20 fileName //不存在20個字符的話有多少算多少將文本中的一些字母按先后順序替換為另外一些字母
tr '()' '[]' fileName**Input**int i=(int)5.8(23 + 5)*2**Output**int i=[int]5.8[23 + 5]*2tr '[a-z]' '[A-Z]' fileName //將文本中的小寫字母替換為大寫字母刪除文本中存在的小寫字母
tr -d '[a-z]' fileName**Input**HelloWorldhow are you**Output**HW將多個連續(xù)出現(xiàn)的給定字符合并為一個
tr -s ' ' fileName //合并多個空格為一個**Input**He lloWor ldhow are you**Output**He lloWor ldhow are you對文本行進行排序
sort fileName**Input**Dr. Rajendra Prasad January 26, 1950 May 13, 1962Dr. S. Radhakrishnan May 13, 1962 May 13, 1967Dr. Zakir Hussain May 13, 1967 August 24, 1969Shri Varahagiri Venkata Giri August 24, 1969 August 24, 1974Shri Fakhruddin Ali Ahmed August 24, 1974 February 11, 1977Shri Neelam Sanjiva Reddy July 25, 1977 July 25, 198**Output**Dr. Rajendra Prasad January 26, 1950 May 13, 1962Dr. S. Radhakrishnan May 13, 1962 May 13, 1967Dr. Zakir Hussain May 13, 1967 August 24, 1969Shri Fakhruddin Ali Ahmed August 24, 1974 February 11, 1977Shri Neelam Sanjiva Reddy July 25, 1977 July 25, 198Shri Varahagiri Venkata Giri August 24, 1969 August 24, 1974sort -r fileName //降序排序對數(shù)字進行排序 sort -rn fileName //對數(shù)字進行降序排序 -n對數(shù)字排序
對輸入文本中第二個字段數(shù)字進行降序排序
sort -t$'/t' -nr -k2 fileName//-t$'/t' 以tab分割文本//-nr 數(shù)字降序排序//-k2 第二個字段**Input**Albany, N.Y. 22.2 46.6 71.1 49.3 38.60 136 64.4 57Albuquerque, N.M. 35.7 55.6 78.5 57.3 9.47 60 11.0 64Anchorage, Alaska 15.8 36.3 58.4 34.1 16.08 115 70.8 39 / 60Asheville, N.C. 35.8 54.1 73.0 55.2 47.07 126 15.3 39Atlanta, Ga. 42.7 61.6 80.0 62.8 50.20 115 2.1 69 / 65Atlantic City, N.J. 32.1 50.6 75.3 55.1 40.59 113 16.2 60 / 54Austin, Texas 50.2 68.3 84.2 70.6 33.65 85 0.9 62 / 58Baltimore, Md. 32.3 53.2 76.5 55.4 41.94 115 21.5 53Baton Rouge, La. 50.1 66.6 81.7 68.1 63.08 110 0.2 52 / 46Billings, Mont. 24.0 46.1 72.0 48.1 14.77 96 56.9 69Birmingham, Ala. 42.6 61.3 80.2 62.9 53.99 117 1.5 60Bismarck, N.D. 10.2 43.3 70.4 45.2 16.84 96 44.3 64Boise, Idaho 30.2 50.6 74.7 52.8 12.19 89 20.6 64Boston, Mass. 29.3 48.3 73.9 54.1 42.53 127 42.8 52 / 66Bridgeport, Conn. 29.9 48.9 74.0 54.7 44.15 119 26.2 55 / 49**Output**Austin, Texas 50.2 68.3 84.2 70.6 33.65 85 0.9 62 / 58Baton Rouge, La. 50.1 66.6 81.7 68.1 63.08 110 0.2 52 / 46Atlanta, Ga. 42.7 61.6 80.0 62.8 50.20 115 2.1 69 / 65Birmingham, Ala. 42.6 61.3 80.2 62.9 53.99 117 1.5 60Asheville, N.C. 35.8 54.1 73.0 55.2 47.07 126 15.3 39Albuquerque, N.M. 35.7 55.6 78.5 57.3 9.47 60 11.0 64Baltimore, Md. 32.3 53.2 76.5 55.4 41.94 115 21.5 53Atlantic City, N.J. 32.1 50.6 75.3 55.1 40.59 113 16.2 60 / 54Boise, Idaho 30.2 50.6 74.7 52.8 12.19 89 20.6 64Bridgeport, Conn. 29.9 48.9 74.0 54.7 44.15 119 26.2 55 / 49Boston, Mass. 29.3 48.3 73.9 54.1 42.53 127 42.8 52 / 66Billings, Mont. 24.0 46.1 72.0 48.1 14.77 96 56.9 69Albany, N.Y. 22.2 46.6 71.1 49.3 38.60 136 64.4 57Anchorage, Alaska 15.8 36.3 58.4 34.1 16.08 115 70.8 39 / 60Bismarck, N.D. 10.2 43.3 70.4 45.2 16.84 96 44.3 64sort -r fileName //降序排序1.輸出字段不全的文本行
a.通過第四列是否為空來判斷awk '{ if( $4 == "") { print "Not all scores are available for "$1 }}'b.通過列數(shù)是否小于4來判斷awk '{ if( NF < 4) { print "Not all scores are available for "$1 }}'輸入:A 25 27 50B 35 75C 75 78 D 99 88 76輸出:Not all scores are available for BNot all scores are available for C2.判斷一個學生的成績是否幾及格
描述:A student is considered to have passed if (s)he has a score or more in each of the three subjects.輸入:A 25 27 50B 35 37 75C 75 78 80D 99 88 76輸出:A : FailB : FailC : PassD : Pass程序:a.循環(huán)遍歷每一個元素,小于50,輸出Failawk '{ flag=1; for(i=2;i<NF;i++) { if($i < 50) { print $1" : Fail"; flag=0; break; } } if(flag==1) { print $1" : Pass"; }}'b.幾乎相同的方法,awk對每一行的文本進行處理awk '{ if( $1 < 50 || $2 < 50 || $3 < 50) { print $1" : Fail" } else { print $1" : Pass" }}'3.統(tǒng)計平均分,根據(jù)平均分輸出A、B、C或Fail 描述:Your task is to identify the performance grade for each student. If the average of the three scores is 80 or more, the grade is ‘A’. If the average is 60 or above, but less than 80, the grade is ‘B’. If the average is 50 or above, but less than 60, the grade is ‘C’. Otherwise the grade is ‘FAIL’. 輸入: A 25 27 50 B 35 37 75 C 75 78 80 D 99 88 76 輸出: A 25 27 50 : FAIL B 35 37 75 : FAIL C 75 78 80 : B D 99 88 76 : A 代碼:
//a.對每一行做處理awk '{ avg = ($4 + $2 + $3)/3; printf $0;printf" : "; if(avg < 50) print "FAIL"; else if(avg < 60) print "C"; else if(avg < 80) print "B"; else print "A";}'//$0表示整行,$1表示第一列,$2表示第二列4.格式化輸出文本行 輸入: A 25 27 50 B 35 37 75 C 75 78 80 D 99 88 76 輸出: A 25 27 50;B 35 37 75 C 75 78 80;D 99 88 76 代碼:
a.使用awk偶數(shù)行輸出文本行回車,奇數(shù)行輸出文本和';'awk '{ if( NR%2 == 0 ) { printf $0"/n"; } else { printf $0";"; }}'b.使用paste命令來實現(xiàn)paste - - -d';' fileName1.將文本中首次出現(xiàn)的the替換為this
sed s/"the "/"this "/ fileName //"the "是因為防止將these替換為thissesed 's/thy /your /gi' fileName//替換所有的thy,不區(qū)分大小寫2.將thy不區(qū)分大小寫地加{}強調(diào)表示
sed 's/thy/{&}/gi' fileName //{&} 加{}且輸出其本身3.文本替換
將部分文本替換為****輸入:1234 5678 9101 1234 2999 5178 9101 2234 9999 5628 9201 1232 8888 3678 9101 1232輸出:**** **** **** 1234**** **** **** 2234**** **** **** 1232**** **** **** 1232a.sed -r -e 's/[0-9]{4} /**** /g' fileName 將四個數(shù)字和一個空格組成的子串替換為"**** "4.將部分子串顛倒位置
輸入:1234 5678 9101 1234 2999 5178 9101 2234 9999 5628 9201 1232 8888 3678 9101 1232輸出:1234 9101 5678 1234 2234 9101 5178 2999 1232 9201 5628 9999 1232 9101 3678 8888sed -r 's/(.+ )(.+ )(.+ )(....)//4 /3/2/1/' fileName1.使用grep獲取匹配整個單詞的某行
grep -w "the" fileName //-w 匹配整個單詞grep -iw "the" fileName //不區(qū)分大小寫grep -ivw 'that' fileName //-v2.匹配文本中包含the 、that 、then 和those的文本
grep -iw -e 'th[e,at,en,ose]' fileName或者grep -iw -e 'the' -e 'that' -e 'then' -e 'those' fileName題目出處:hackerrank.com
新聞熱點
疑難解答