鸟哥Linux心得

"查阅各组件的型号
lspci
cat /proc/cpuinfo

crontab -l //查看当前用户下的cron任务
crontab -e //编辑当前用户的定时任务
crontab -u linuxso -e //编辑用户linuxso的定时任务
基本格式:

          • command
            分 时 日 月 周 命令
            第一列表示分钟1-59,每分钟用或者/1表示
            第二列表示小时1-23.(0表示0点)
            第三列表示日期1-31
            第四列表示月份1-12
            第五列标识星期0-6(0表示星期天)
            第六列表示要运行的命令

磁盘分区表(partition table)
磁盘分区表只有64byte,最多只能容忍四笔分割的记录。这四个分割的记录被称为主要(Primary)或延伸(Extended)分割槽:
· 其实所谓的『分割』只是针对那个64 bytes的分割表进行设定而已!
· 硬盘默认的分割表仅能写入四组分割信息
· 这四组分割信息我们称为主要(Primary)或延伸(Extended)分割槽
· 分割槽的最小单位为磁柱(cylinder)
· 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分割槽迚行数据的处理

注意:分割表只有记录四组数据的空间,但是这并不代表一个硬盘只能分割成四个分割槽。可以通过延伸(Extended)分割槽的方式来解决该问题。延伸分割的目的是使用额外的扇区来记录分割信息,延伸分割本身并不能被拿来格式化,可以透过延伸分割所指向的那个区块继续做分割的记录。
主要分割、延伸分割不逡辑分割的特性我们作个简单的定丿啰:
· 主要分割不延伸分割最多可以有四笔(硬盘的限制,逻辑分割槽的装置名称号码由5号开始即/dev/sdb1, /dev/sdb2/,dev/sdb3, /dev/sdb4,这是系统的特性)
· 延伸分割最多叧能有一个(操作系统的限制)
· 逡辑分割是由延伸分割持续切割出来的分割槽;
· 能够被格弅化后,作为数据存叏的分割槽为主要分割不逡辑分割。延伸分割无法格式化;
· 逡辑分割的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逡辑分割(5号到63号), SATA硬盘则有11个逡辑分割(5号到15号)。

Shell Script

从理论方面解释为何环境变量的数据可以被子程序所引用:
这是因为内存配置的关系,
1.当启动一个shell后,操作系统会分配一个记忆区块给shell使用,此内存内的变量可以让子程序使用;
2.若在父程序利用 export 功能,可以让自定义变量的内容写到上述的记忆区块当中(环境发量);
3.当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境发量所在的记忆区块导入自己的环境发量区块当中。

变量键盘读取,数组与宣告:read array declare
read [pt] variable
选项与参数:
-p :后面可以接提示字符
-t :后面可以接等待的秒数

eg:让用户由键盘输入一内容,将该内容变成名为atest的变量
read atest

eg:提示使用者30秒内输入自己的大名,将该输入字符串作为名为named的变量内容
read -p “please keyin your name:” -t 30 named

declare / typeset(宣告变量的类型)

declare [] variable
选项与参数:
-a :将后面名为 variable 的变量定义成为数组 (array) 类型
-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x :用法与export 一样,就是将后面的 variable 变成环境发量;
-r :将发量设定成为 readonly 类型,该发量不可被更改内容,也不能 unset
eg:让变量 sum 进行 100+300+50 的加总结果
sum=100+300+50
注意直接echo $sum与先declare -i sum=100+300+50 再echo $sum的区别

在默认的情况下,bash对于变量的几个基本的定义:
1.变量类型默认为【字符串】,所以若不指定变量类型,则1+2为一个【字符串】,而不是【计算式】;
2.bash环境中的数值运算,预设最多仅能达到整数形态,所以1/3的结果是0;

数组(array)变量类型
array[index]=context
意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 … 等等,
那个 index 就是一些数字,重点是用中刮号([ ])来设定的。 目前我们 bash 提供的是一维数组

eg:设定上面提到的var[1] ~ var[3] 的变数
var[1]=“small min”
var[2]=“big min”
var[3]=“nice min”
echo “ v a r [ 1 ] , {var[1]}, var[1],{var[2]},${var[3]}”——>small min, big min, nice min
注:数组的变量类型比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组} 的方式来读取,比较正确无误

与文件系统及程序的限制关系:ulimit
ulimit [] [配额]
eg:限制用户仅能建立 10MBytes 以下的容量的档案(单位是 Kbytes)
ulimit -f 10240

$?(指令回传值)与&&或||

指令回传值:若前一个指令执行结果正确,在linux底下会回传一个$? = 0的值

指令下达情况                                                  说明
cmd1 && cmd2                               若cmd1执行完毕且正确无误($?=0),则开始执行cmd2
                                           若cmd1执行完毕且为错误($?≠0),则cmd2不执行
                                           
cmd1 || cmd2                               若cmd1执行完毕且正确无误($?=0),则cmd2不执行
                                           若cmd1执行完毕且为错误($?≠0),则开始执行cmd2

eg:使用ls查阅目录/root/abc是否存在,若存在,则用touch建立/root/abc/hehe

——>ls /root/abc && touch /root/abc/hehe (命令执行成功的前提是目录/root/abc存在)

eg:测试/root/abc是否存在,若不存在则予以建立,若存在就不做任何事情

——>ls /root/abc || touch /root/abc

eg:我不清楚目录/root/abc是否存在,但就是要建立/root/abc/hehe档案

——>ls /root/abc || touch /root/abc/hehe && touch /root/abc/hehe
—>如果/root/abc目录存在, ? = 0 − > ∣ ∣ 因为 ∣ ∣ 遇到 0 的 ?=0 -> ||因为||遇到0的 ?=0>∣∣因为∣∣遇到0?不会进行操作,此时$?=0继续向后传递 $?=0 -> && ? ≠ 0 ; 如果 / r o o t / a b c 目录不存在 , ?≠0; 如果/root/abc目录不存在, ?=0;如果/root/abc目录不存在,?≠0 -> 因为||遇到非为0的$? 故开始创建目录 $?=0 -> && $?≠0;

ls /root/abc  && touch /root/abc/hehe || touch /root/abc/hehe 

—>如果/root/abc目录存在,$?=0 -> && $?=0 -> || ? ≠ 0 ; 如果 / r o o t / a b c 目录不存在 , ?≠0; 如果/root/abc目录不存在, ?=0;如果/root/abc目录不存在,?≠0 -> && $?≠0 -> || $?=0;

常用顺序:command1 && command2 || command3

截取命令: cut, grep

cat /etc/passwd | cut -f 1,6-7 -d ‘:’

cut -d’分割字符’ -f fields <==用于有特定分割字符
cut -c 字符区间 <==用于排列整齐的讯息
选项与参数:
-d :后面接分割字符。与-f一起使用;
-f :依据 -d 的分割字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;

字符转换命令: tr, col, join, paste, expand

例如:将文件/etc/passwd中的小写字母转换为大写字母,然后再尝试删除文本中的冒号:
cat /etcpasswd |tr ‘[a-z]’ ‘[A-Z]’
cat /etcpasswd |tr -d ‘:’

分割命令:split
split [bl] file PREFIX
选项与参数:
-b:后面可接欲分割的档案的大小,可加单位,例如b,k,m等
-l: 以行数来进行分割
PREFIX:代表前导符的意思,可作为分割档案的前导文字。

eg:我的/etc/termcap有七百多k,若先分割成三百多k一个档案时?
split -b 300k /etc/termcap termcap

eg:如何将多个小档案合成一个档案,档案名为termcapbak
cat termcap* >> termcapbak

eg:使用ls -al /输出的信息中,每十行记录成一个档案
ls -al / |split -l 10 - lsroot

参数代换:xargs

解析:从字面上的意思来看,x是加减乘除的乘号,args则是arguments(参数)的意思,所以说,这个玩意是在产生某个指令的参数的意思。xargs可以读入stdin的数据,并且以空格符或者断行字符作为分辨,
将stdin的资料分割成arguments。因为是以空格符作为分割,所以如果有一些档名或者是其它意义的名词内含有空格时xargs可能就会误判了。

xargs [-0epn] command
选项与参数:
-0:如果输入stdin含有特殊符号,例如`,,空格键等字符时,这个-0参数可以将他还原成一般字符。这个参数可以用于特殊状态。
-e:这个是EOF(end of file)的意思,后面可以接一个字符串,当xags分析到这个字符串的时候,就会停止继续工作。
-p:在执行每个指令的argument时,都会询问使用者的意思。
-n:后面接次数,每次command指令执行时,要使用几个参数的意思
当xargs后面没有接任何参数的时候,默认是以echo来进行输出

eg::将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个指令将每个账号内容显出来
cut -d’:’ -f1 /etc/passwd |head -n 3| xargs finger

eg:同上,但是每次执行 finger 时,都要询问使用者是否执行?
cut -d’:’ -f1 /etc/passwd |head -n 3| xargs -p finger – -p的选项可以让用户在使用过程中,被询问到每个指令是否执行!

eg:将所有的 /etc/passwd 内的账号都以 finger 查阅,但一次仅查阅五个账号
cut -d’:’ -f1 /etc/passwd | xargs -p -n 5 finger
– 一般来说,某些指令后面可以接的arguments 是有限制的,不能无限制的累加,此时,我们可以利用-n来帮助我们将参数分成数个部分,每个部分分别再以指令来执行!

eg:同上,但是当分析到lp,就结束这串指令?
cut -d’:’ -f1 /etc/passwd | xargs -p -e’lp’ finger – 注意,那个 -e’lp’ 是连在一起的,中间没有空格键。

eg:找出 /sbin 底下具有特殊权限的档名,并使用 ls -l 列出详细属性
find /sbin -perm +7000 | ls -l
– 结果竟然仅有列出 root 所在目录下的档案!这不是我们要的! 这是因为 ll (ls) 并不是管线命令的原因啊! 应当使用下面这组命令:
find /sbin -perm +7000 | xargs ls -l

关于减号-的用途
管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环, 所以请特别留意!另外,在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin ,
某些指令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 “-” 来替代,举例来说:
tar -cvf - /home | tar -xvf -
– 上面这个例子是说:『我将 /home 里面的档案给他打包,但打包的数据不是记录到档案,而是传送到stdout;经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。
后面的这个 - 则是取用前一个挃指令的 stdout, 因此,我们就不需要使用 file 了。

正规表示法与文件格式化处理

什么是正规表示法:简单的说,正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为,正规表示法透过一些特殊符号的辅助,
可以让使用者轻易的达到【搜寻/删除/取代】某特定字符串的处理程序!
说明:正规表示法基本上是一种【表示法】,主要工具程序支持这种表示法,那么该工具就可以作为正规表示法的字符串处理之用。例如vi,grep,awk,sed等工具。

限定连续RE字符范围{} (因{与}符号在shell中有特殊含义,因此,我们就需要使用跳脱字符\让其失去特殊意义)

eg:假如我要查找2个o的字符串
grep -n ‘o{2}’ regular_express.txt

eg:假设我要找到g后面接2到5个o,然后再接一个g的字符串
grep -n ‘go{2,5}g’ regular_express.txt

eg:假设我要两个o以上的goooo…g字符串呢
grep -n ‘go{2,}’ regular_express.txt

基础正则表示法特殊字符

RE字符                                 意义与范例

^word                                  意义:待搜寻的字符串word在行首
                                       范例:搜索行首以#开头的那一行,并列出行号  grep -n '^#' regular_express.txt 
									   
word$                                  意义:待搜索的字符串word在行尾

.                                      意义:代表【一定有一个任意字符】的字符

\                                      意义:跳脱字符,讲特殊符号的特殊意义去除

*                                      意义:代表重复零个到无穷多个的前一个RE字符(在*之前一定要接近着一个RE字符,例如任意字符则为【.*】)

[list] 意义:字符集合的RE字符,里面列出想要择取的字符

[n1-n2] 意义:字符集合的RE字符,里面列出想要择取的字符范围

[^list] 意义:字符集合的RE字符,里面列出的不要的字符串或范围

{n,m} 意义:连续n到m个[前一个RE字符];若为{n}则是连续n个的前一个RE字符

再次强调:『正则表示法的特殊字符』与一般在指令列输入指令的『通配符』并不相同, 例如,在通配
符当中的 * 代表的是『 0 ~ 无限多个字符』的意思,但是在正则表示法当中, * 则是『重复 0 到无穷
多个前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!

sed工具

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:删除,因为是删除,所以后面通常不接任何东西
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p:打印,亦即将某个选择的数据印出。通常p会与sed -n一起运作
s:取代,可以直接进行取代的工作,通常这个s的动作可以搭配正规表达式,例如,1,20s/old/new/g

以行为单位的新增和删除功能

eg:将/etc/password的内容列出来并打印行号,同时请将2-5行的内容删除

cat -n /etc/password | sed ‘2,5d’

只删除第二行:cat /etc/password | sed ‘2d’

删除第三到最后一行:cat -n /etc/password | sed ‘3,$d’

eg:承上题,在第二行后加上drink tea

cat -n /etc/password | sed 'drink tea or …\

drink beer’

显示如下:
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
Drink tea or …
drink beer ?
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
…(后面省略)…

总结:这个范例的重点是『我们可以新增不只一行!可以新增好几行』但是每一行之间都必须要以反斜杠
『 \ 』来进行新行的增加

以行为单位的取代与显示功能

eg:我想将2-5行的内容取代为’this is mine’

cat -n /etc/password | sed ‘2,5c this is mine’

eg:仅列出/etc/password档案内的第5-7行

nl /etc/password | sed -n ‘5,7p’ (特别注意[-n]这个重要的选项,代表安静模式,具体区别可自行实践比较)

部分数据的搜寻与取代功能

eg:通过/sbin/ifconfig eth0命令查询到的信息取出其中的IP

步骤一:利用关键词配合grep取出关键的一行数据: /sbin/ifconfig eth0 | grep ‘inet addr’
步骤二:将前面的IP部分予以删除: /sbin/ifconfig eth0 | grep ‘inet addr’ |
> sed ‘s/^.*addr://g’
步骤三:将IP后面的部分予以删除: /sbin/ifconfig eth0 | grep ‘inet addr’ |
> sed ‘s/^.addr://g’ | sed 's/Bcast.$//g’

eg:假设我只要MAN存在的那几行数据,但是含有#在内的批注不要,空白行也不要

步骤一:先使用grep将关键词MAN所在行取出来: cat /etc/man.config | grep ‘MAN’
步骤二:删除掉批注之后的数据: cat /etc/man.config | grep ‘MAN’| sed ‘s/#.*KaTeX parse error: Expected 'EOF', got '#' at position 58: … 'MAN'| sed 's/#̲.*//g’ |
> sed ‘/^$/d’

直接修改档案内容(危险操作,请勿使用系统文档进行测试)

eg:利用sed将regular.txt内每一行结尾若为.替换为!

sed -i ‘s/.$/!/g’ regular_express.txt

eg:利用sed在regular.txt的最后一行加入【# This is a test】

sed -i ‘$a # This is a test’ regular_express.txt

awk:好用的数据处理工具

awk也是一个非常棒的数据处理工具!相较于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个【字段】来处理。awk的格式如下:

awk ‘条件类型1 {动作1} 条件类型2 {动作2}…’ filename

说明:awk后面接两个单引号并加上大括号{}来设定想要对数据进行的处理动作。awk可以处理后续接的档案也可以读取来自前个命令的standard output。但
如前面说的awk主要是处理【每一行的字段内的数据】,而默认的【字段的分隔符为"空格键"或"tab按键"】

取出空白行与行首为#的行列:
正规表达式为:grep -v ‘^KaTeX parse error: Expected group after '^' at position 34: …txt | grep -v '^̲#' 延伸表达式为:egrep…|^#’ regular_express.txt

说明:延伸表达式表示法可以透过群组功能『 | 』来进行一次搜寻!那个在单引号内的管线意义为『或 or』

格式化打印:printf(P435)

printf ‘打印格式’ 实际内容

选项与参数:

关于格式方面的几个特殊样式:

\a 警告声音输出
\b 退格键(bacsspace)
\f 清楚屏幕
\n 输出新的一行
\r 亦即Enter键
\t 水平的tab键
\v 垂直的tab键
\xNN NN为两位数的数字,可以转换数字成为字符。

关于C语言格式内, 常见的变数格式

%ns n是数字,s代表string,亦即多少个字符;
%ni n是数字,i代表integer亦即多少整数字数;
%N.nf n与N都是数字,f代表floating(浮点),如果有小数字数,假设我共要是个位数,但小数点有两位,亦即%10.2f

档案比对工具:diff

diff就是用在比对两个档案之间的差异的,并且是以行为单位来对比的。举例来说

diff [bBi] from-file to-file
选项与参数:
from-file:一个档名,作为原始比对档案的档名;
to-file:一个档名,作为目的比对档案的档名;
-b:忽略一行当中,仅有多个空白的差异(例如"about me"与"about me"视为相同)
-B:忽略空白行的差异
-i:忽略大小写的不同

cmp

相对于diff的广泛用途,cmp似乎就没被用那么多了~cmp主要也是在对比两个档案,它主要利用[字节]单位对比,因此可以对比binary file(diff主要是以[行]为单位进行对比)

cmp [-s] file1 file2
选项与参数:
-s:将所有的不同点的字节处都列出来。因为cmp预设仅会输出第一个发现的不同点

patch 打补丁

shell scripts(亦即针对shell所写的脚本)

shell scripts撰写的注意事项:
1.指令的执行是从上而下、从左而右的分析与执行;
2.指令、选项与参数之间的多个空白行都会被忽略;
3.空白行也将被忽略,并且[tab]按键所推开的空白同样视为空白键;
4.如果读取到一个Enter符号(CR),就尝试开始执行该行或该串的命令;
5.如果一行的内容过多,可以使用【[Enter]】来延伸至下一行;
6.【#】可作为批注。

对谈式脚本:变量内容由用户决定

软件磁盘整列(soft RAID)

磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,意思是:容错式廉价磁盘阵列。 RAID 可以透过一个技术(软件戒硬件),将多个较小的磁盘整合成为一个较大的磁盘装置;
而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能。整个 RAID 由于选择的等级(level) 不同,而使得整合后的磁盘具有不同的功能, 基本常见的 level 有这几种

? RAID-0 (等量模式, stripe):效能最佳

这种模式如果使用相同型号不容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (举例来说, 4KB), 然后当一个档案要写入 RAID 时,该档案会依据区块的大小切割好,
之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB
的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。

? RAID-1 (映像模式, mirror):完整备份

这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘!如果是不同容量的磁盘组成 RAID-1 时,那么总容量将以最小的那一颗磁盘为主!这种模式主要是『让同一份数据,完整的保存在两
颗磁盘上头』。举例来说,如果我有一个 100MB 的档案,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。
由亍两颗硬盘内容一模一样,好像镜子映照出来一样, 所以我们也称他为 mirror 模式。

? RAID 0+1,RAID 1+0

RAID-0 的效能佳但是数据不安全,RAID-1 的数据安全但是效能不佳,那么能不能将这两者整合起来设定 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所谓的 RAID 0+1 就是: (1)先让两颗
磁盘组成 RAID 0,并且这样的设定共有两组; (2)将这两组 RAID 0 再组成一组 RAID 1。这就是 RAID 0+1 啰!反过来说,RAID 1+0 就是先组成 RAID-1 再组成 RAID-0 的意思。

? RAID 5:效能与数据备份的均衡考虑

RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似RAID-0 , 不过每个循环的写入过程中,在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据
会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。

定时任务命令:

at

排程单一工作的任务!『at TIME』为指令下达的方法
透过 atq, atrm 可以查询不删除 at 的工作排程

batch

batch 与 at 相同,不过 batch 可在 CPU 工作负载小于 0.8 时才进行后续的工作排程

crontab

系统的循环例行性工作排程使用 cron 这个服务,同时利用 crontab -e 及 /etc/crontab 进行排程的安排

? crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;
? /etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;

anacron

配合 /etc/anacrontab 的设定,可以唤醒停机期间系统未进行的 crontab 任务

ps :将某个时间点的程序运作情况撷取下来

[root@www ~]# ps aux <==观察系统所有的程序数据
[root@www ~]# ps -lA <==也是能够观察所有系统的数据
[root@www ~]# ps axjf <==连同部分程序树状忞
选顷不参数:
-A :所有的 process 均显示出来,与 -e 具有同样的作用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。

[root@www ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用!
通常会搭配数据流重导向来将批次的结果输出成为档案。
-n :与 -b 搭配,意思是,需要进行几次 top的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。

pstree:显示进程树
[root@www ~]# pstree [-A|U] [-up]
选顷不参数:
-A :各程序树之间的连接以 ASCII 字符来连接;
-U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误
-p :同时列出每个 process 的 PID;
-u :同时列出每个 process 的所属账号名称。

free :观察内存使用情况
[root@www ~]# free [-b|-k|-m|-g] [-t]
选项与参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 来显示单位!
-t :在输出的最终结果,显示物理内存与 swap 的总量。

uname:查阅系统与核心相关信息
[root@www ~]# uname [-asrmpi]
选项与参数:
-a :所有系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)

uptime:观察系统启动时间与工作负载

netstat :追踪网络或插槽文件
[root@www ~]# netstat -[atunlp]
选项与参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不已程序的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的程序 PID

dmesg :分析核心产生的讯息

vmstat :侦测系统资源变化
[root@www ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
[root@www ~]# vmstat [-fs] <==内存相关
[root@www ~]# vmstat [-S 单位] <==设定显示数据的单位
[root@www ~]# vmstat [-d] <==与磁盘有关
[root@www ~]# vmstat [-p 分割槽] <==与磁盘有关
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
-f :将开机到目前为止,系统复制 (fork) 的程序数;
-s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量;
-d :列出磁盘的读写总量统计表
-p :后面列出分割槽,可显示该分割槽的读写总量统计表

范例一:统计目前主机 CPU 状忞,每秒一次,共计三次!
[root@www ~]# vmstat 1 3

fuser:藉由档案(或文件系统)找出正在使用该档案的程序
[root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u :除了程序的 PID 之外,同时列出该程序的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶局,对 umount 不成功很有效!
-v :可以列出每个档案与程序还有指令的完整相关性!
-k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 啰!

lsof :列出被程序所开启的档案文件名
[root@www ~]# lsof [-aUu] [+d]
选项与参数:
-a :多项数据需要『同时成立』才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该用户相关程序所开启的档案;
+d :后面接目录,亦即找出某个目录底下已经被开启的档案!

linux如何在shell中自动生成1到100的数组
 第一种方法:

for i in {1…100}

do

echo $i

done

第二种方法:

使用seq函数

for i in seq 1 100

do

echo $i

done

pidof :找出某支正在执行的程序的 PID
[root@www ~]# pidof [-sx] program_name
选项与参数:
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个程序的 PID
范例一:列出目前系统上面 init 以及 syslogd 这两个程序的 PID
[root@www ~]# pidof init syslogd
1 4286

ntsysv: 类图形接口管理模式

chkconfig: 设定自己的系统服务
[root@www ~]# chkconfig [–add|–del] [服务名称]
选项与参数:
–add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在/etc/init.d/ 内
–del :删除一个给 chkconfig 管理的服务

现在你知道 chkconfig 与 ntsysv 是真好用的东西,那举如果我自己写了一个程序并且想要让该程序成为系统服务好让chkconfig 来管理时,可以怎么进行呢?
只要将该服务加入 init 可以管理的 script 当中,亦即 /etc/init.d/ 当中即可。
举个例子,我们在 /etc/init.d/ 里面建立一个 myvbird 档案,该档案仅是一个简单的服务范例,基本上,没有任何用途…
对于该档案的必须性是这样的:
? myvbird 将在 run level 3 及 5 启动;
? myvbird 在 /etc/rc.d/rc[35].d 当中启动时,以 80 顺位启动,以 70 顺位结束。
关于所谓的顺位问题,我们会在第二十章介绍,这里你先看看即可。 你该如何进行呢?可以这样做:
[root@www ~]# vim /etc/init.d/myvbird
#!/bin/bash

chkconfig: 35 80 70

description: 没啥!只是用来作为练习之用的一个范例

echo “Nothing”

这个档案很好玩喔!你可以参考你自己系统上面的档案;基本上,比较重要的是第二行,他的语法是: 『 chkconfig: [runlevels] [启动顺位] [停止顺位] 』
其中, runlevels 为不同的 run level 状态,启动顺位 (start number) 与 结束顺位(stop number) 则是在 /etc/rc.d/rc[35].d 内建立以 S80myvbird 及 K70myvbird 为档名的设定方式!

[root@www ~]# chkconfig --list myvbird
service myvbird supports chkconfig, but is not referenced in any
runlevel (run ‘chkconfig --add myvbird’)

尚未加入 chkconfig 的管理机制中!所以需要再动点手脚

[root@www ~]# chkconfig --add myvbird; chkconfig --list myvbird
myvbird 0:off 1:off 2:off 3:on 4:off 5:on 6:off

看吧!加入了 chkconfig 的管理当中了!

很有趣吧!如果要将这些数据都删除的话,那么就下达这样的情况:

[root@www ~]# chkconfig --del myvbird
[root@www ~]# rm /etc/init.d/myvbird
chkconfig 真的是个不错用的工具吧!尤其是当你想要自己建立自己的服务时! _

CentOS 系统设定工具(图形化交互方式):setup

手动设定打印机: lpadmin, lpstat, lpr, lp, lpq, lprm

硬件信息的收集与分析: lspci, lsusb, iostat, vmstat
? fdisk:可以使用 fdisk -l 将分割表列出;
? hdparm:可观察硬盘的信息与测试读写速度;
? dmesg:观察核心运作过程当中所显示的各项讯息记录;
? vmstat:可分析系统 (CPU/RAM/IO) 目前的状态;
? lspci:列出整个 PC 系统的 PCI 接口装置;
? lsusb:列出目前系统上面各个 USB 端口的状态,与连接的 USB 装置;
? iostat:与 vmstat 类似,可实时列出整个 CPU 与接口设备的 Input/Output 状态。

[root@www ~]# lspci [-vvn]
选项与参数:
-v :显示更多的 PCI 接口装置的详细信息;
-vv :比 -v 还要更详细的细部信息;
-n :直接观察 PCI 的 ID 而不是厂商名称

[root@www ~]# lsusb [-t]
选项与参数:
-t :使用类似树状目录来显示各个 USB 端口的相关性

[root@www ~]# iostat [-c|-d] [-k|-m] [-t] [间隔秒数] [侦测次数]
选项与参数:
-c :仅显示 CPU 的状态;
-d :仅显示储存设备的状态,不可与 -c 一起用;
-k :默讣显示的是 block ,这里可以改成 K bytes 的大小来显示;
-m :与 -k 类似,只是以 MB 的单位来显示结果。
-t :显示日期出来;

使用 lm_sensors 取得温度、电压等信息: sensors-detect, sensors

vim编辑器快捷键的使用

在 linux 底下最常使用的文书编辑器为 vi ,请问如何进入编辑模式?
o 在一般模式底下输入: i, I, a, A 为在本行当中输入新字符;(出现 –Insert- )
o 在一般模式当中输入: o, O 为在一个新的一行输入新字符;
o 在一般模式当中输入: r, R 为取代字符!(左下角出现 –Replace-)

如何由编辑模式跳回一般模式?
[Esc]

若上下左右键无法使用时,请问如何在一般模式移劢光标?
h, j, k, l

若 [pagedown] [ pageup] 在一般模式无法使用时,如何往前或往后翻一页?
[Ctrl] + [f]
[Ctrl] + [b]

如何到本档案的最后一行、第一行;本行的第一个字符、最后一个字符?
G, 1G, 0, $

如何删除一行、n 行;如何删除一个字符?
dd, ndd, x 或 X (dG 及 d1G 分别表示删除到页首及页尾)

如何复制一行、n 行并加以贴上?
yy, nyy, p 或 P

如何搜寻 string 这个字符串?
o ?string (往前搜寻)
o /string (往后搜寻)

如何取代 word1 成为 word2,而若需要使用者确认机制,又该如何?
:1, s / w o r d 1 / w o r d 2 / g 或 : 1 , s/word1/word2/g 或 :1, s/word1/word2/g:1,s/word1/word2/gc (需要使用者确认)

如何读取一个档案 filename 进来目前这个档案
:r filename

如何另存新档成为 newfilename?
:w newfilename

如何存档、离开、存档后离开、强制存档后离开?
:w; :q: :wq; :wq!

如何设定与取消行号?
:set nu
:set nonu

档案与目录管理

请问底下的目录主要放置什么数据?
o /etc/:几乎系统的所有配置文件案均在此,尤其 passwd, shadow
o /etc/rc.d/init.d:系统开机的时候加载服务的 scripts 的摆放地点
o /boot:开机配置文件,也是预设摆放核心 vmlinuz 的地方
o /usr/bin, /bin:一般执行档摆放的地方
o /usr/sbin, /sbin:系统管理员常用指令集
o /dev:摆放所有系统装置档案的目录
o /var/log:摆放系统注册表档案的地方

新增目录、移除目录、移动目录与拷贝目录有什么指令可用?
o 新增: mkdir 目录,
o 移除: rmdir 目录(但是该目录内必须要已经清空了), rm –rf 目录,
o 移动: mv directory1 directory2
o 拷贝: cp –r directory1 directory2

如何查看一个档案的『内容』(不要使用 vi 的情况下)
cat, tac, more, less, head, tail, nl, od(查看二进制)

什么是 hard link 与 soft link 的档案?有何不同?
o Hard Links:在做成 hard link 档案时,系统会占用掉一个 inode ,由连结档案可发现其link 字段多使用了一个 inode ,当源文件被删除的时候,
该源文件的内容将继续保留在其他的 Hard Links 档案中;但所有 Link 占用的硬盘总量仅占一个档案的容量大小!(但Hard link 不能连结不同 filesystem 的档案)
o Soft Links:类似快捷方式,当原始档被删除,soft link 档案将找不到原始档了!

如何在 root 的家目录下建立一个 /bin 的连结快捷方式
ln –s /bin /root/bin

在比较两个档案的异同时,常使用的是 diff 与 cmp ,请教两者有何不同?
diff 为一行一行比较, cmp 为一个字符(character)一个字符比较

磁盘挂载与虚拟内存问题

查看 Linux 系统当中所有已经挂载的硬盘容量与 inodes ?
df –k, df –i,

查看目前所在目录的所有档案占用的硬盘空间,此外,如何仅输出结果?
du -k, du –i, du -s

如果扇区 /dev/hda3 有问题,偏偏他是被挂载上的,请问我要如何修理此一扇区
umount /dev/hda3
fsck /dev/hda3

承上题,那么有问题的档案将被移动到那个目录下?
lost+found

试说明新增一个 partition 在 /dev/hdb 当中,且为 hdb5 时,并挂载上 /disk2 ,需要哪些步骤?
o fdisk /dev/hdb 按 n 新增,按 e 新增 extended ,再按 n 新增 logical
o mke2fs –b 2048 /dev/hdb5
o mkdir /disk2
o mount –t ext2 /dev/hdb5 /disk2

如果要设定一个新挂载上的扇区,令他可以在开机的时候被挂载上,应该编辑哪一个档案?
o 先 /etc/fstabo 再 mount –a

简易说明 quota 的设置流程?
o 编辑 /etc/fstab, 加入 usrquota and/or grpquota
o reboot
o quotacheck –avug (会产生 aquota.user(group))
o quotaon –aug
o edquota –u username
o edquota –g groupname
o repquota –vu /dev/hd[a-d][1-16]

BASH SHELL

简单说明 bash shell 的功能特征:
o 命令记忆功能 ~/.bash_history
o 命令别名功能 alias
o shell scripts 功能
o 命令与文件名补全功能
o 工作控制功能 jobs

在设定变量中,主要的规则为何?

  1. 变量与变量内容以等号来连结;
  2. 等号两边不能直接接空格符;
  3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
  4. 若有空格符可以使用双引号『 " 』或单引号『 ’ 』来将变量内容结合起来,但须要特别留意,双引号内可以保有变量,但是单引号则仅为一般字符;
  5. 必要时需要以跳脱字符『 \ 』来将特殊符号(如 Enter, $, , 空格符, ’ 等)变成一般符号;
  6. 若该变量为扩增变量内容时,则需以双引号及 变量名称如:『 " 变量名称如:『 " 变量名称如:『"PATH":/home』继续累加内容;
  7. 若该变量需要在其他子程序执行,则需要以 export 来使变量可以动作,如『export PATH』;
  8. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者共兴趣与嗜好);
  9. 取消变量的方法为:『unset 变量名称』

显示环境变量与所有变量的指令为何?
env, set,

Command1 command2 这个指令代表什么意思?
在这一行当中, command2 会先执行,而输出的结果会给 command1 当作参数。
例:cd /lib/modules/uname -r/kernel 是最常使用的一例

在管线指令中,我要将 last 输出的结果显示 root 的『登入次数』, 如何做?
last | grep root | cut –d “ “ –f 1 | wc -l

如何将 /bin 的所有信息输出到 /home/testing.dat 这个档案?
ls –al /bin 1> /home/testing.dat?

在上一题中,若还要输出到屏幕上,要如何是好?
ls –al /bin | tee /home/testing.dat

在判断式中,如何判断一个档名是否存在?
if [ -e filename ] 若存在则回传值为真!

文件系统(ext2)

Block (区块): 档案在磁盘中被储存在整数固定大小的区块中, 那区块的大小通常是 2的次方。在预设中,ext2 文件系统的区块大小是 4K。研究表示, 4K 字节对于一磁盘
区块而言是最理想的大小,假如一个档案的大小无法达成 4K 字节的倍数时, 那最后的磁盘区块部分就会被浪费。在最不好的例子中几乎在完整的区块中就有一字节被浪费掉

Superblock:superblock 是在每个文件系统开始的位置, 其储存信息像是文件系统的大小,空的和填满的区块,它们各自的总数和其他诸如此类的数据。 要从一个文件系统
中存取任何档案皆须经过文件系统中的 superblock。如果 superblock 损坏了, 它可能无法从磁盘中去取得数据。

Inode: 对于文件系统而言一个 inode 是在 inode 表格中的一个项目。 Inode 包含了所有档案有关的信息例如名称、大小、连接的数量、数据建立之日期,修改及存取的时
间。 它也包含了磁盘区块的档案指向(pointer)。pointer 是用来记录档案被储存在何处。

Etx2fs公用程序

e2fsck
这个程序允许我们在 ext2 文件系统上去执行文件系统检查,它像是 Windows 中的
Scandisk 一样,但却是一种更有效的系统检查方式。在此,我们可以加上一个文件名
来检查上面之损坏区块。
警告:绝对不要在任何已挂载的文件系统上执行 e2fsck/fsck。假如我们想要去执行
fsck,我们应该卸下文件系统后再去执行 fsck(亦即需要 umount 该扇区啰)。如果
不这样做,可能会让文件系统毁损。

tune2fs
这允许我们去调整文件系统的参数设定。在此,我们可以设定在两个文件系统检查间之
最大挂载总数、容量标记、错误行为、变更保留的信息和许多其他参数。

dumpe2fs
这个程序将 ext2 文件系统状态输出到标准的设备上。它对于分析问题以及存取一般关
于文件系统用法的信息是有帮助的。

mke2fs
这个程序允许我们在先前尚未格式化的磁盘中,去建立一个 ext2 的文件系统。 它提供
了许多的选项包含区块的大小、段落的大小、每一个 inode 的字节到多种磁盘阵列的选
项。 mke2fs 通帯在第一次安装的期间执行,并建立完成新的 root 及其他的文件系
统。(就相当于 DOS 底下的 format 程序啦!)

badblocks
这个程序去搜寻磁盘并检查区块是否已经损坏,它通帯会在新的文件系统安装程序前执
行, 但请不要在挂载好的文件系统上执行。

一个简单的 SPFdisk (special fdisk) 程序分割

man -k command

1.对要比较的两个文件进行排序

sort -r 1.txt -o 1.txt
sort -r 2.txt -o 2.txt
1
2
2.用script新建一个txt文件

script difference.txt
1
3.查找在2.txt文件中存在,在1.txt文件中不存在的命令

grep -vFf 1.txt 2.txt
1
4.退出对difference.txt的编辑

exit
————————————————
至此,2.txt文件中存在而1.txt文件中不存在的内容就会全部记录在difference.txt中。
想要得到1.txt文件中存在而2.txt文件中不存在的内容同理。

版权声明:本文为CSDN博主「祖国的花朵33」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yunyi4367/article/details/78882552

EOF的使用

cat > /usr/local/mysql/my.cnf << EOF //或者cat << EOF > /usr/local/mysql/my.cnf
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock

[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock

basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
EOF

在shell里面,“%”、“#”、“” 是什么意思,如KaTeX parse error: Expected '}', got 'EOF' at end of input: {a%%.*}、{a##.}

${varible##string} 从左向右截取最后一个string后的字符串
${varible#string}从左向右截取第一个string后的字符串
${varible%%string
}从右向左截取最后一个string后的字符串
${varible%string
}从右向左截取第一个string后的字符串

例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
————————————————
版权声明:本文为CSDN博主「longroey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/long375577908/java/article/details/78498235
更详细的教程链接:https://www.cnblogs.com/chengd/p/7803664.html

linux 去掉字符串前后命令

经过学习 发现主要有三种做法 1 sed 行操作 做替换,2 awk, 3,grep 做检索 。
整理下分享给大家。

echo " aaa bbb ccc " | awk ‘{sub(/^ */,“”);sub(/ *$/,“”)}1’

echo " aaa bbb ccc "|awk ‘$1=$1’

echo " aaa bb cc " | sed -e “s/1//g" | sed -e "s/[ ]$//g”

echo " aa bb cc " |sed -r ‘s/2+(.*)[ \t]+$/\1/’

echo " aa bb cc " | grep -o “[^ ]+( +[^ ]+))*”


  1. ↩︎

  2. \t ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值