1.
|
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 这个名称是否存在;
- 若不存在,则建立一个档案,使用 touch 来建立,建立完成后离开;
- 如果存在的话,判断该名称是否为档案,若为档案则将之删除后建立一个档案,档名为 logical ,之后离开;
- 如果存在的话,而且该名称为目录,则移除此目录!
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 下来!