LINUX 部分命令

1.

[root@test root]# grep [-acinv] '搜寻字符串' filename
参数说明:
-a :将 binary 档案以 text 档案的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
eg://[] 以及 [^] 以及 []  1.grep -n 't[ae]st' regular_express.txt  2.last | grep root  3.grep -n 'oo' regular_express.txt 4.grep -n '[^g]oo' regular_express.txt//如果我不想要 oo 前面有 g 的话呢?此时,可以利用在集合字符的反向选择 [^] 来  5.grep -n '[^a-z]oo' regular_express.txt//前面不要小字  6. grep -n '[0-9]' regular_express.txt// 取得有数字的行
 ///行首与行尾字符 ^ $ 1.grep -n '^the' regular_express.txt 2. grep -n '\.$' regular_express.txt  3. grep -n '^$' regular_express.txt//空白行  4. grep -v '^$' /etc/syslog.conf | grep -v '^#'//去取空行,和#开头的行 ////任意一个字符 . 与重复字符 *  * 代表的是『重复 0 个或多个前面的 RE 字符』 『 . 』则代表『绝对有一个任意字符』的意思 grep -n 'ooo*' regular_express.txt//至少两个 o 以上的字符串 //限定连续 RE 字符范围 {} grep -n 'o\{2\}' regular_express.txt//假设我要找到两个 o 的字符串

2.格式化打印: printf

[root@linux ~]# printf '打印格式' 实际内容
参数:
关于格式方面的几个特殊样式:
       \a    警告声音输出
       \b    退格键(backspace)
       \f    清除屏幕 (form feed)
       \n    输出新的一行
       \r    亦即 Enter 按键
       \t    水平的 [tab] 按键
       \v    垂直的 [tabl] 按键
       \xNN NN 为两位数的数字,可以转换数字成为字符。
关于 C 程序语言内,常见的变数格式
       %ns   那个 n 是数字, s 代表 string ,亦即多少个字符;
       %ni   那个 n 是数字, i 代表 integer ,亦即多少整数字数;
       %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数,
             假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
范例:


范例一:将刚刚上头的数据变成档案,仅列出姓名与成绩:(用 [tab] 分隔
[root@linux ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' `cat printf.txt`
Name     Chinese         English         Math    Average
DmTsai   80      60      92      77.33
VBird    75      55      80      70.00
Ken      60      90      70      73.33
# 假设我将上面的档案存成 printf.txt 档案档名,则可利用上面的案例,
# 将每个单字中间以 [tab] 按键隔开。由上面的输出来看,虽然第二行以后是 OK 的,
# 但是第一行则因为某些单字长度较长,所以就无法对齐了!而 %s 表示以字符串 (string)
# 的方式来展现该内容。而每个内容则以 \t 即 [tab] 来隔开啊!


范例二:将上述资料关于第二行以后,分别以字符串、整数、小数点来显示:
[root@linux ~]# printf '%10s %5i %5i %5i %8.2f \n' `cat printf.txt |\
> grep -v Name`
    DmTsai    80    60    92    77.33
     VBird    75    55    80    70.00
       Ken    60    90    70    73.33
# 这个时候的输出可就有趣了!我将几个内容分成不同的数据格式来输出,
# 最有趣的应该是 %8.2f 这个项目了!我可以针对不同的小数字数来进行格式输出,
# 例如变成底下的样子时,您自己试看看,会是输出什么结果喔!
# printf '%10s %5i %5i %5i %8.1f \n' `cat printf.txt | grep -v Name`


范例三:列出数值 45 代表的字符为何?
[root@linux ~]# printf '\x45\n'
E
# 这东西也很好玩~他可以将数值转换成为字符,如果您会写 script 的话,
# 可以自行测试一下,由 20~80 之间的数值代表的字符是啥喔!

3.sed 工具简介

[root@linux ~]# sed [-nefr] [动作]
参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在指令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i :直接修改读取的档案内容,而不是由屏幕输出。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function 有底下这些咚咚: a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 正规表示法!例如 1,20s/old/new/g 就是啦! 范例: 范例一:将 /etc/passwd 的内容列出,并且我需要打印行号,同时,请将第 2~5 行删除! [root@linux ~]# nl /etc/passwd | sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(后面省略)..... # 看到了吧?因为 2-5 行给他删除了,所以显示的数据中,就没有 2-5 行啰~ # 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦! # 同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔! # 而,如果只要删除第 2 行,可以使用 nl /etc/passwd | sed '2d' 来达成, # 至于第 3 到最后一行,则是 nl /etc/passwd | sed '3,$d' 的啦!  范例二:承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样! [root@linux ~]# nl /etc/passwd | sed '2a drink tea' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 嘿嘿!在 a 后面加上的字符串就已将出现在第二行后面啰!那如果是要在第二行前呢? # nl /etc/passwd | sed '2i drink tea' 就对啦! 范例三:在第二行后面加入两行字,例如『Drink tea or .....』『drink beer?』 [root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ......\ > drink beer ?' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin Drink tea or ...... drink beer ? 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 这个范例的重点是,我们可以新增不只一行喔!可以新增好几行~ # 但是每一行之间都必须要以反斜线 \ 来进行新行的增加喔!所以,上面的例子中, # 我们可以发现在第一行的最后面就有 \ 存在啦!那是一定要的喔! 范例四:我想将第2-5行的内容取代成为『No 2-5 number』呢? [root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 number' 1 root:x:0:0:root:/root:/bin/bash No 2-5 number 6 sync:x:5:0:sync:/sbin:/bin/sync # 没有了 2-5 行,嘿嘿嘿嘿!我们要的数据就出现啦! 范例五:仅列出第 5-7 行 [root@linux ~]# nl /etc/passwd | sed -n '5,7p' 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # 为什么要加 -n 的参数呢?您可以自行下达 sed '5,7p' 就知道了!(5-7行会重复输出) # 有没有加上 -n 的参数时,输出的数据可是差很多的喔! 范例六:我们可以使用 ifconfig 来列出 IP ,若仅要 eth0 的 IP 时? [root@linux ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA  inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略)..... # 其实,我们要的只是那个 inet addr:..那一行而已,所以啰,利用 grep 与 sed 来捉 [root@linux ~]# ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | \ > sed 's/Bcast.*$//g' # 您可以将每个管线 (|) 的过程都分开来执行,就会晓得原因啰! # 去头去尾之后,就会得到我们所需要的 IP 亦即是 192.168.1.12 啰~ 范例七:将 /etc/man.config 档案的内容中,有 MAN 的设定就取出来,但不要说明内容。 [root@linux ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | \ > sed '/^$/d' # 每一行当中,若有 # 表示该行为批注,但是要注意的是,有时候, # 批注并不是写在第一个字符,亦即是写在某个指令后方,如底下的模样: # 『shutdown -h now # 这个是关机的指令』,批注 # 就在指令的后方了。 # 因此,我们才会使用到将 #.*$ 这个正规表示法! 范例八:利用 sed 直接在 ~/.bashrc 最后一行加入『# This is a test』 [root@linux ~]# sed -i '$a # This is a test' ~/.bashrc # 上头的 -i 参数可以让你的 sed 直接去修改后面接的档案内容喔!而不是由屏幕输出。 # 至于那个 $a 则代表最后一行才新增的意思。
4.declare 宣告变量内容 
[test @test test]# declare [-afirx] 参数说明: -a :定义为数组 array -f :定义为函数 function  -i :定义为整数 integer -r :定义为『只读』 -x :定义为透过环境输出变量 范例: [test @test test]# declare -i a=3 [test @test test]# declare -i b=5 [test @test test]# declare -i c=$a*$b [test @test test]# echo $c 15 <==变成数字啰!
5.read 的功能就是『依据您在键盘输入的结果 input 到变量内容中
6.条件式判断:if...then...fi, case.....esac if [ 条件判断一 ] && (||) [ 条件判断二 ]; then       <== if 是起始的意思,后面可以接若干个判断式,使用 && 或 ||     执行内容程序 elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then     <==第二段的判断,如果第一段没有符合就来此搜寻条件     执行第二段内容程序 else                                            <==当前两段都不符合时,就以这段内容来执行!     执行第三段内容程序 fi                                              <==结束 if then 的条件判断!
eg:
echo "Press y to continue" read yn if [ "$yn" = "y" ]; then         echo "script is running..." else         echo "STOP!" fi ---------------------------逻辑判断式-------------------- 
if [ ! -e logical ]; then //断定到底有没有档案(用 -e )         touch logical         echo "Just make a file logical"         exit 1 elif [ -e logical ] && [ -f logical ]; then //名称是属于目录或者是档案( -d -f ),         rm logical         mkdir logical         echo "remove file ==> logical"         echo "and make directory logical"         exit 1 elif [ -e logical ] && [ -d logical ]; then         rm -rf logical         echo "remove directory ==> logical"         exit 1 else         echo "Does here have anything?" fi
-----使用 case ...esac 的方式 case 种类方式(string) in          <==开始阶段,那个种类方式可分成两种类型,通常使用 $1 这一种直接下达类型!     种类方式一)        程序执行段        ;;                     <==种类方式一的结束符号!     种类方式二)        程序执行段        ;;     *)        echo "Usage: {种类方式一|种类方式二}"     <==列出可以利用的参数值!        exit 1 esac                         <==这个 case 的设定结束处!
eg:
case $1 in                                   <==使用直接下达指令型态!  one)         echo "your choice is one"         ;;  two)         echo "your choice is two"         ;;  three)         echo "your choice is three"         ;;  *)         echo "Usage {one|two|three}"       <==列出可以使用的参数(如果使用者下达错误的参数时)         exit 1 esac 
 
7.循环:for....do....done, while...do...done, until...do...done, 
  • for (( 条件一; 条件二; 条件三 )) declare -i s # <==变量宣告 for (( i=1; i<=100; i=i+1 )) do         s=s+i done echo "The count is ==> $s"
  • ____________________-

    LIST="Tomy Jony Mary Geoge"

    for i in $LIST do         echo $i done

  • ----将你的 Linux 主机上的账号 ( account ) 印出来呢
    account=`cut -d ":" -f1 /etc/passwd|sort` 
    echo "The following is your linux server's account" 

    for i in $account do         echo $i done

  • while [ condition1 ] && { || } [ condition2 ] ...//当条件相同的时候,就继续做!
  • declare -i i declare -i s while [ "$i" != "101" ] do         s=s+i         i=i+1 done echo "The count is ==> $s"
  • until [ condition1 ] && { || } [ condition2 ] ... //until:直到条件相同的时候才离开程序 declare -i i declare -i s until [ "$i" = "101" ] do         s=s+i         i=i+1 done echo "The count is ==> $s" ----------- echo "Press Y/y to stop" until [ "$yn" = "Y" ] || [ "$yn" = "y" ] do         read yn done echo "Stop here"
  • 先查看一下 /root/test/logical 这个名称是否存在;
    1. 若不存在,则建立一个档案,使用 touch 来建立,建立完成后离开;
    2. 如果存在的话,判断该名称是否为档案,若为档案则将之删除后建立一个档案,档名为 logical ,之后离开;
    3. 如果存在的话,而且该名称为目录,则移除此目录!

    if [ ! -e logical ]; then
            touch logical
            echo "Just make a file logical"
            exit 1
    elif [ -e logical ] && [ -f logical ]; then
            rm logical
            mkdir logical
            echo "remove file ==> logical"
            echo "and make directory logical"
            exit 1
    elif [ -e logical ] && [ -d logical ]; then
            rm -rf logical
            echo "remove directory ==> logical"
            exit 1
    else
            echo "Does here have anything?"
    fi

    8.script 如何 debug
    sh [-nvx] scripts
    -n :不要执行 scripts ,查询 scripts 内的语法,若有错误则予以列出!
    -v :在执行 scripts 之前,先将 scripts 的内容显示在屏幕上;
    -x :将有使用到的 scripts 内容显示在屏幕上,与 -v 稍微不同!

    9.groupadd
    groupadd [-g GID] groupname
    参数说明:
    -g GID :自行设定 GID 的大小
    范例:
    [root @test /root]# groupadd -g 55 testing<==设定一个群组,GID为 55

     

    Sed 命令列可分成编辑指令与文件档部份。其中 , 编辑指令负责控制所有的编辑工作 ; 文件档表示所处理的档案

    //////////////////////////////////////////////////////////////////////////////////////////////

    1.gcc hello.c
    # 这个时候,在本目录下会产生一个名为 a.out 的执行档!
    # 在预设的状态下,如果我们直接以 gcc 编译原始码,并且没有加上
    # 任何参数,则执行档的档名会被自动设定为 a.out 这个文件名称!

    运行:./a.out

    2.gcc -c hello.c
    # 会产生一个名为 hello.o 的目标文件,object file 的附档名为 *.o 喔!
     
    gcc -o hello hello.o
    # 这个步骤是利用 hello.o 这个目标文件制作出一个名为 hello 的执行档
    # 详细的 gcc 语法我们会在后续章节中继续介绍!
    # 透过这个动作后,我们可以得到 hello 及 hello.o 两个档案,
    # 真正可以执行的是 hello 这个 binary file 喔!

     
    # 3. 执行一下这个档案:
    ./hello


    3. thanks.c调用thanks_2.c程序
    gcc -c thanks.c thanks_2.c
    # 产生了两个目标文件!
    gcc -o thanks thanks.o thanks_2.o
     
    # 3. 执行一下这个档案:
    ./thanks

    4.Gcc 参数
    gcc -O -c thanks.c thanks_2.c # -O 为产生最佳化的参数
    gcc -Wall -c thanks.c thanks_2.c
    thanks.c: In function `main':
    thanks.c:5: warning: implicit declaration of function `thanks_2'
    thanks.c:6: warning: control reaches end of non-void function
    thanks_2.c: In function `thanks_2':
    thanks_2.c:3: warning: implicit declaration of function `printf'
    # -Wall 为产生更详细的编译过程信息。上面的讯息为警告讯息( warning )
    # 所以不用理会也没有关系!

    ============在编译与连结的时候将这个函式库给他连结进执行档里面=======
    gcc sin.c -lm -L/lib -L/usr/lib
    # 特别注意,那个 -lm 可以拆开成两部份来看,
    # -l 是『加入某个函式库(library)』的意思,而
    # m 则是 libm.so 这个函式库,其中, lib 与附档名(.a 或 .so)不需要写
    # 所以 -lm 表示使用 libm.so (或 libm.a) 这个函式库的意思~
    # 至于那个 -L 后面接的路径呢?这表示:
    #『我要的函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻!
    #运行 ./a.out
    注意:由于 Linux 预设是将函式库放置在 /lib 与 /usr/lib 当中
    ============关于程序中的#include <stdio.h>============
    说的是要将一些定义数据由 stdio.h 这个档案读入,这包括 printf 的相关设定。这个档案其实是放置在 /usr/include/stdio.h 的!那么万一这个档案并非放置在这里呢?那么我们就可以使用底下的方式来定义出要读取的 include 档案放置的目录:gcc sin.c -lm -I/usr/include//默认值是放置在 /usr/include
    =================================================
    # 仅将原始码编译成为目标文件,并不制作连结等功能:
    [guest@test guest]# gcc -c hello.c
    # 会自动的产生 hello.o 这个档案,但是并不会产生 binary 执行档。
     
    # 在编译的时候,依据作业环境给予最佳化执行速度

    [guest@test guest]# gcc -O hello.c -c
    # 会自动的产生 hello.o 这个档案,并且进行最佳化喔!
     
    # 在进行 binary file 制作时,将连结的函式库与相关的路径填入
    [guest@test guest]# gcc sin.c -lm -L/usr/lib -I/usr/include
    # 这个指令较常下达在最终连结成 binary file 的时候,
    # -lm 指的是 libm.so 或 libm.a 这个函式库档案;
    # -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
    # -I 后面接的是原始码内的 include 档案之所在目录。
     
    # 将编译的结果输出成某个特定档名
    [guest@test guest]# gcc -o hello hello.c
    # -o 后片接的是要输出的 binary file 檔名
     
    # 在编译的时候,输出较多的讯息说明
    [guest@test guest]# gcc -o hello hello.c -Wall
    # 加入 -Wall 之后,程序的编译会变的较为严谨一点,
    # 所以警告讯息也会显示出来!


    /////////////////////////////////////////////////////////////////

    nl:       在每一行前面加上行号
    eg:      ls | nl

    joint:    根据给定的字段(field)把两个文件中的行连接起来

    cut:       剪除一行中的指定字段
    csplit:    将一个文件中的指定行去除

    banner: 用字符来组成字符
    eg:        banner -c a hello
                 用字母a组成一个hello的字样

    od:        用二进制来显示文件内容

    seq:       顺序的产生一组数字(1,3,5,7,。。。)
    eg:         seq 2 2 10
                  产生2,4,6,8,10

    ascii:       显示ascii table

    sort:      排序
    uniq:      去除相同的行

    watch: 循环运行指定的命令
    eg:       watch -n 3 -d ps U wangwei
                每3秒运行一次命令" ps U wangwei ",同时将两次不同的地方以反白显示出来

    sed:    stream editor
    tee:    将stdin中的数据copy出一份,同时将数据传送给stdout

    zip,unzip: zip data

    tar:     将多个文件打包

    diff,patch: 文件比较,补丁工具
    umount /dev/hdb2
    mount -a
    more /etc/mtab
    mount -a -o remount <==这个指令可以重新将 /etc/fstab 的咚咚 mount 下来!



    你可能感兴趣的:(LINUX 部分命令)