歡迎您光臨本站 註冊首頁

【讀書筆記】《Linux 命令、編輯器與shell編程》

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

作者:洪海輝
《Linux 命令、編輯器與shell編程》(美)Mark G.Sobell 著 楊明軍 王鳳芹 譯 清華大學出版社

2007-12-24
終端處理字元:
ctrl+z 掛起,可用fg切換到前台,jobs 查看後台任務情況;
ctrl+w 刪除單詞;
ctrl+u 刪除行 ctrl+x好像沒有效果;

定位工具:
which 只在設定的路徑搜索,只報告第一個找到的;
whereis 在標準路徑,顯示所有的;
type 確定文件是否為內置命令;
apropos 關鍵字
whatis 完全匹配關鍵字;

符號鏈接:
內置命令pwd顯示鏈接名;
工具(/bin/pwd)顯示路徑;
info bash builtin 列出內置命令;

2007-12-25
vim的使用:
ctrl+w 刪除單詞;
ctrl+h 刪除行 ctrl+u;
:redo ctrl+r 撤銷;
ctrl+l 刷新;
vim -r 檢查交換文件;

命令模式移動游標
字元移動 空格 h和l;Ff
字移動 Ww W按空白分隔字元
行移動 j k
句子 ()
段 {}
屏幕 H M L

刪除
dG 刪除到末尾;
d1G 從開始刪除;
d0 從行的開始;
~ 修改大小寫;

替換
1,。 開始到當行;
。,$ 當前到末尾;
1,$ 或 % 所有;
:1,$s/ten/te/g 所有行的所有ten替換成te;

2008-01-05
數組變數:
賦值
NAMES=(max helen sam zach)
NAMES[1]=fly
引用值
#echo ${NAMES[2]}
sam
——————————————————————————————
下標
  • 和[@]的區別:
    作用都是提取整個數組,但是加雙引號工作機制卻不同:
    @將原來的數組複製到新的數組,新舊一樣,相當於複製;
    *將原來的數組當一個元素複製到新的數組
    例:
    A=("${NAMES
  • }")
    B=("${NAMES[@]}")
    用declare -a 顯示數組內容
    [root@Test ~]# declare -a
    declare -a NAMES='([0]="max" [1]="helen" [2]="sam" [3]="zach")'
    declare -a A='([0]="max helen sam zach")'
    declare -a B='([0]="max" [1]="helen" [2]="sam" [3]="zach")'

    echo ${#NAMES
  • } 元素的個數
    [root@Test ~]# echo ${#NAMES
  • }
    4
    echo ${#NAMES[0]} 元素的長度
    [root@Test ~]# echo ${#NAMES[0]}
    3
    —————————————————————————————————
    ((count=count-1))雙扣號,保證shell看成算術表達式,變數不用$
    $$ 進程ID,方便創建唯一的文件名;
    $0 命令本身;
    $! 後台進程PID;
    $?退出狀態;
    $# 除命令本身外的參數個數;
    $*和$&的區別:
    $* 將所有參數當成一個整體(一個參數);
    $@ 和原來的一樣;
    跟下標
  • [@]一樣
    ——————————————————————————————————
    shift左移命令 為了得到任意一個參數,循環掃描命令行;
    set 初始命令行參數值;
    set $(date)
    set date
    ———————————————————————————————————
    :- 使用默認值 ${name:-default}
    := 賦默認值 ${name:=default}
    : 內置命令 賦值並不執行 : ${name:=default}
    :? 顯示錯誤信息,並返回狀態1,shell不退出;${name:?message}
    ————————————————————————————————————
    路徑操作符
    # 最小去除前綴;
    ## 最大去除前綴;
    % 最小去除前綴;
    %% 最大去除前綴;
    例:
    [root@Test ~]# test=/usr/local/src/proftpd-1.2.10.tar.gz
    [root@Test ~]# echo ${test}
    /usr/local/src/proftpd-1.2.10.tar.gz
    [root@Test ~]# echo ${test#/*}
    usr/local/src/proftpd-1.2.10.tar.gz
    [root@Test ~]# echo ${test##/*}
    [root@Test ~]# echo ${test%/*}
    /usr/local/src
    [root@Test ~]# echo ${test%%/*}

    [root@Test ~]# echo ${#test} 顯示字元個數
    36
    —————————————————————————————————————
    sed的使用:
    參數:
    -n 顯示除了p指令;
    -i 將修改保存到文件;
    指令:
    d 刪除,整行刪除;
    n 顯示選中的行當前,從輸入中讀入下一行;
    a 每一行之後追加文件,以\換行;
    i 行之前追加;
    c 替換文件(整行);
    s 替換地址;
    w 重定向到新文件;
    r 追加行之後;
    q 退出;
    控制結構:
    !NOT $!d 除了末行之外;
    {} 指令組;為分隔
    Pattern區和Hold區:
    Pattern:工作平台(保存剛讀入的行);
    Hold:臨時工作區
    H P->H 將一個換行符和內容追加到H
    h P->H 將P區替換掉H
    G H->P 將一個換行符和內容追加到G
    g H->P 將H區替換掉P
    例:
    sed '5 q' filename 顯示前5行;
    sed '2 a test' filename 第2行之後插入一個換行符和test;
    sed '/the/n;p' file 所有匹配the不顯示;
    sed 's/^. /\t&/' filename 行首不是空格插入製表符;
    (^. ) 行首不是空格;
    s/^/\t/ 行首插入製表符;
    s/ *$// 行尾的空格全部刪除;
    sed 'G' filename 每行之後插入一個空行;
    倒序:
    2,$ G
    h
    $! G
    ——————————————————————————————
    cat
    -A(-vET)
    -b 對非空行進行編號;
    -n 對所有行進行編號;
    -s 去除多餘的空白行;
    cut
    -c
    -d 分隔符;
    -f
    例:
    [root@Test sh]# ll |tr -s ' ' ' '|cut -f 5,9 -d ' '
    2.3K a
    2.2K b
    4.0K BK/
    436 ip.1
    452 ip.2
    264 ip.a
    85K ip.list
    22K ipList.temp
    486 sample.sh*
    9.9K selectInfo.sh*
    4.0K temp/
    tr -s 將多個空格化成單個空格;

    [root@Test 20080114]# grep -n '^' test
    1:a
    2:b
    3:c
    4:d
    '^' 匹配所有的行;
    -n 對所有的行進行編號

    [root@Test 20080114]# grep -h a * |sort|uniq -c
    2 a
    -h 不顯示文件名;
    uniq -c 對於重複的行只顯示一遍,並對重複的次數進行統計;

    [root@Test 20080114]# vi $(grep -l 'a' *)
    2 files to edit
    編輯多個匹配的文件;
    -l 匹配的文件名;

    #kill -9 0
    對於普通用戶來說相當於註銷;
    對於root等於關機,請慎用;
    ————————————————————————————————
    ls的參數:
    -A 顯示除了.. . 兩個外的所有文件;
    -F 顯示文件特徵;
    -r 逆順;
    -t 按修改時間;
    -x 行顯示;
    -1 一行顯示一個文件;
    ————————————————————————————————
    sort
    參數:
    -b 排除欄位之前的空格和TAB;
    -f 將小寫看成大寫(大寫在前);
    -n 算術排序,負號和小數點有意義;
    -r 逆順;
    -t x 分隔符x;
    -u 重複的行只顯示一次;
    -k start[,stop]
    註:
    大寫在小寫之前;
    空白符在之前;
    第一遍比較無相同,不進行第二遍查詢;
    例:
    #sort --key=2 test 第2欄位;

    #sort -k 2 -f test 第2欄位,小寫看成大寫;

    #sort -k 2 -b test 第2欄位,欄位前面的空白符和TAB忽略;

    #sort -fb -k 3.4 test 第3欄位的第4個字元開始;

    #sort -b -k 3.4 -k -2f test
    第一遍:第3欄位的第4字元
    第二遍:第2欄位,小寫看成大寫;

    #sort -k 1 -k 5 test
    先第一欄位(沒有指定結尾,便是到結束),再第五欄位;
    但是如果第一遍比較沒有相同,不進行第2遍比較;

    #sort -k 1,1 -k 5 test
    先第一欄位,-k 1,1(第一欄位的第一字元到stop:第一欄位)
    再進行第五欄位;

    #sort -u -k 1f -k 1 test
    進行二遍比較,當有大小寫相同的欄位時;
    ——————————————————————————————
    正則表達式:
    星號:
    /(.*)/ 與圓括弧最長匹配;
    /([^)]*)/ 與圓括弧最短匹配;

    空正則表達式:
    /\(test\)/ 和/test/一樣;
    /a\(b*\)c/ 和/ab*c/一樣;

    替換字元串:
    &符號 與正則匹配的字元串匹配
    \n 轉義數字
    例:
    :1,$/\([^,]*\),\(.*\)/\2 \1/
    1,$ 所有的行;
    \([^,]*\)和[^,]*一樣,匹配除逗號外的任意字元串;
    \2 代表第2個括弧內的正則;
    ————————————————————————————————
    擴展正則:
    + 匹配字元前面1個或多個;
    ?匹配字元前面0個或1個
    例:
    /ab+c/ abc abbc
    /ab?c/ ac abc
    /(ab)+c/ abc ababc
    /(ab)?c/ c abc

    /ab|ac/ ab ac abac
    /^Exit|^Quit/ 以Exit 或者Quit 開頭的
    /(D|N)\.Jones/ D.Jones N.JOnes

    vim中 \|代表 |

    特殊字元:
    . 單個字元;
    * 與*前面的0個或者多個字元;
    \< 字的開始;
    \> 字的末尾;

  • [火星人 ] 【讀書筆記】《Linux 命令、編輯器與shell編程》已經有498次圍觀

    http://coctec.com/docs/linux/show-post-187523.html