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 下来!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值