linux 学习 3-4

11 AUG

8.5 内存交换空间swap的构建

  • 当内存不足时,为了让后续的程序可以顺利运行,因此内存中暂时不适用的程序与数据就会被挪到swap中。
  • swap是用硬盘来暂时放置内存中的信息。

8.5.1 使用物理分区构建swap
步骤:
- 分区:fdisk /dev/hdc(这里hdc没有数字), 让内核更新分区表 partprobe

partprobe
这个命令执行完毕之后不会输出任何返回信息,你可以使用mke2fs命令在新的分区上创建文件系统。
注意:
该操作必须具体到新建的那个分区,否则无法成功重新读取分区表
如:
partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy). As a result, it may not reflectddf all of your changes until after reboot.(错误信息,提示重启,但是重启之后也无法成功,因为partprobe需要针对单个新增分区才适当)
如:
partprobe /dev/sda9————/dev/sda9为刚用fdisk新建的分区,显示成功
http://blog.sina.com.cn/s/blog_64220bc3010185hj.html

  • 格式化mkswap /dev/hdc7
  • 查看与加载 free, 使用swapon /dev/hdc7使其生效
  • 使用swapon -s列出目前使用的swap设备有哪些

8.5.2 使用文件构建swap
如果在物理分区无法支持的环境下,就要用到loop设备构建方法了。

  • 使用dd命令来新增一个大文件在/tmp下面 dd if=/dev/zero of=/tmp/swap bs=1M count=128
  • 查看大文件是否创建好 ll -h /tmp/swap
  • 格式化成swap文件格式mkswap /tmp/swap
  • 使用swapon来将/tmp/swap启动: free, swapon /tmp/swap, 查阅当前swap列表swapon -s
  • 可以使用swapoff关掉swap file, swapoff /tmp/swap, 再用free检查一下

8.6.3 利用GNU的parted进行分区

  • 新增分区 mkpart [primary|logical|extended] [ext3|vfat] Start End, eg parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB
  • 列出分区表资料 parted /dev/hdc print
  • 删除第八分区(hdc8) parted /dev/hdc rm 8

使用fdisk /dev/hdc删除注意,由于是逻辑分区,这些分区一定从5号开始连续编号,因此最好不要从6号删除,否则原本的7号在删除后将变成6号

df能看到的是已经mount的device,未mount的是看不到的。

14 AUG
P249-

gzip [-cdtv#] FileName & zcat FileName.gz把解压后的文件内容输出到屏幕上。

  • bzip2 [-cdkzv#] FileName & bzcat FileName.bz2
打包命令
  • -z与gzip有关(通过gzip进行压缩/解压缩)
  • -jbzip2有关(通过bzip2进行压缩/解压缩)
    • -c 是压缩tar -jcv -f FileName.tar.bz2
    • -t 是查询tar -jtv -f FileName.tar.bz2
    • -x 是解压缩tar -jxv -f FileName.tar.bz2 -C 欲解压缩的目录
    • 使用-p这个参数可以保存原本文件的权限与属性。
  • -c,-t,-x不能再同一串命令行中出现
  • -v 指压缩/解压缩过程中把正在处理的文件名显示出来
  • 仅解压单一文件的方法

    • 先找到要解压的文件名tar -jtv -f FileName.tar.bz2 | grep 'keyword'
    • 将该文件解开 tar -jxv -f FileName.tar.bz2 FileName/TargetFile
  • --exclude=file 打包某目录,但不包含目录下的某些文件 tar -jcv -f FlieName.tar.bz2 --exclude=FileName/targerfile.

    • eg . exclude ‘*.local’ tar -jcv -f etc1.tar.bz2 /etc/ --exclude=*.local
    • then check tar -jtv -f etc1.tar.bz2 | grep local
  • 仅备份比某个时刻还要新的文件 -newer

    • 找出比/etc/passwd还要新的文件 find /etc -newer /etc/passwd
    • 备份 tar -jcv -f etc2.tar.bz2 --newer-mtime="dd/mm/yyyy" /etc/*

9.4 完整备份工具 dump

使用方法:
dump [-Suvj] [-level] [-f 备份文件] 待备份数据,如dump -0u -f dumpfile /dev/sda3

  • -0u中,u的意思是将这次dump的时间记录到/etc/dumpdates文件中,查看系统自动新建的记录文件 cat /etc/dumpdates
  • dump -W 列出在/etc/fstab里面的具有dump设置的分区是否有备份过
  • dump -S /dev/sda3 dump之前先测试一下如果要备份此文件系统需要多少容量,单位是byte。

Note
留意-0u处。dump可以指定不同的备份等级。加入指定等级为1时,此时新备份的数据只会记录与第一次备份所有差异的文件。eg level 0是完整备份,level 1备份的是与level 0的差异部分,以此类推。

用dump备份一个文件夹
dump文件夹时, -u level 1-9都是不适用的。所以我们只能够使用level 0的完整备份将文件夹dump下来。eg. dump -0j -f dumpfile /etc 把文件夹/etc dump到dumpfile文件中,并进行压缩。

  • -j参数代表用bzip2对数据进行压缩

restore 恢复文件

  • 用restore查看dump后的备份数据内容: restore -t -f dumpfile . 显示出文件名与源文件的inode状态。
  • 还原备份: restore -r -f dumpfile

常见的压缩与备份工具
9.6.1 dd
dd可以直接读取磁盘设备的内容(几乎是直接读取扇区),然后将整个设备备份成一个文件。
dd if="input file" of="output file" bs="block size" count="number"
其中if为input file,或者是设备dev,of为output file, bs则规划的一个block的大小,count就是多少个bs的意思。
如果要还原备份,只需要把if和of调过来就好了。

开机挂载错误
我们可以在/etc/fstab 设置开启挂载,不过如果在/etc/fstab 定义了挂载信息可是实际并不存在此分区,开机进行分区挂载时就会产生错误,导致我们不能进入操作系统
解决办法
1. 使用单用户进入MA模式
2. 设置重新挂载,解决只读问题
mount -n -o remount,rw /
3. 修改/etc/fstab/,删除不能mount的分区

10.1 vim

多文件编辑
http://www.cnblogs.com/hnrainll/archive/2011/04/29/2032662.html

  • :files 列出这个vim打开的所有文件
  • :n去到下一个编辑的文件
  • :N去到上一个编辑的文件
  • :split 分成垂直的两个窗口
  • :vsplit分成水平的两个窗口
  • :sp 打开一个新窗口EE
  • ctrl+ww切换到下一个窗口
  • ctrl+w + ↑↓←→ 切换窗口

可以在“vimrc”文件中修改设置/etc/vimrc

15 AUG
11.1 bash

转义特殊字符:
> name=VBird\'s\ name
> echo $name
> VBird's name

变量累加
> PATH=$PATH
> PATH="$PATH"
> PATH=${PATH}

eg
> PATH=${PATH}helllllo

如何获取内核版本
> uname -r
进入目前内核的驱动程序所放置的目录
> cd /lib/modules/$(uname -r)/kernel

在变量的设置中,双引号能仍然保有变量的内容,但单引号内仅能是一般字符,不会有特殊符号(变量)

export: 自定义变量转成环境变量 (为了方便子进程能继续使用父进程的自定义变量)
> export 变量名称

取消变量名称 eg unset $A

11.2.7 与文件系统及程序的限制关系 ulimit
ulimit [-SHacdfltu] [配额]
eg

  • 列出目前身份的所有限制数据数值 ulimit -a
  • 限制用户仅能建立10MB以下容量的文件 ulimit -f 10240

11.2.8 变量内容的删除、替代与替换

${path#/*keyword}}
eg
${path#/*kerberos/bin:}

eg 删除前面所有目录,仅保留最后一个目录:
${path#/*:} 但是一个#只能删除最短的那个匹配
${path##/*:}两个#就删除最长的那个匹配

往前删除
${path%:*bin} %表示第一个符合字符串
${path%%:*bin} %%表示最长的符合字符串

变量的测试与内容替换 “-”减号
> username=${username-content} 更新变量username,如果变量username没有被赋值,则会被赋值为content;如果变量已被赋值,则不会改变。

11.3 命令别名与历史命令

命令别名设置:alias, unalias
eg alias lm='ls -l | more'

查看所有命令别名: alias

取消别名: unalias lm

16 AUG
source:读入环境配置文件的命令。eg source filename将当前设置读进目前的shell环境中。

  • 数据重定向 eg ll / > ~/rootfile 系统根目录的内容就会存在rootfile中。
  • 查找/home下面是否有名为.bashrc的文件存在 find /home -name .bashrc (一般情况下不需要加搜索的目标路径(eg /home),默认是搜索当前工作目录下的文件)
  • 将正确与错误的数据分别存入不同的文件中 find /home -name .bashrc > list_right 2> list_error
标准输入stdin代码为0,使用<或<<
标准输出stdout代码为1,使用>或>>
标准错误输出stderr代码为2,使用2>或2>>
  • cat > catfile < ~/.bashrc 用stdin替代键盘的输入以创建新文件(把/.bashrc文件的内容传到catfile中,相当于cp)

11.5.2 命令执行的判断依据 ;,&& ||
如何解决两个命令之间有相依性这个问题?

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

eg

  • ls /tmp/abc && touch /tmp/abc/hehehe 使用ls查阅目录/tmp/abc是否存在,若存在则用touch创建/tmp/abc/hehehe。如果/tmp/abc不存在,则后面的touch不会执行。
  • ls /tmp/abc || mkdir /tmp/abc 使用ls查阅目录/tmp/abc是否存在,若不存在则用madir创建

命令是从左到右执行的!

11.6 管道命令
11.6.1 选取命令:cut, grep

cut 可以用来分析log文件

  • cut -d '分割字符' -f fields. eg: echo $PATH | cut -d ':' -f 5 将PATH变量取出,找出第五个路径(从1开始数)。输出结果:/usr/sbin。如果想要列出第三和第五个字符,则:echo $PATH |cut -d ':' -f 3,5
  • 将export输出的信息取得第12字符以后(去掉declare -x)的所有字符串 export | cut -c 12- 输出每行第12字符以后的字符。如要指定某个范围的值,可以 cut -c 12-20

grep
grep可以解析一行文字,取得关键字,若该行存在关键字,就会整行列出来。

  • grep [-acinv] [--color=auto] '查找字符串' filename. -i 为大小写不敏感,-n为输出行号, -v为反向选择,–color为特殊颜色显示关键字部分。

11.6.2 排序命令 sort, wc, uniq
应用场景:统计这个月登陆本主机的用户数量(using last)

  • sort

    • sort [-fbMnrtuk] [file or stdin] -f, 忽略大小写;-b 忽略第一个空格;-M,用月份排序;-r, 反向排序。
    • eg cat /etc/passwd | sort
    • -t,分隔符,如 -t ':'
    • -k, 以某个区间(field)来排序,如 -k 3
    • eg cat /etc/passwd | sort -t ':' -k 3 以第三列来排序
  • uniq
    将重复的数据仅显示一个。
    -i 忽略大小写
    -c 进行计数
    eg

wc
计算某个文件有多少字多少行多少字符。
-l 仅列出行
-w 仅列出多少字
-m 列出多少字符
eg cat /etc/man.config | wc

tee
双向重定向
eg last | tee last.list | cut -d "" -f 1 (不影响后面的处理)

减号的用途 -
某些命令需要用到文件名(例如tar)来进行处理时,该stdin与stdout可以利用减号”-“替代,eg
tar -cvf - /home | tar -xvf - 把/home文件夹里面的文件打包,并把打包的数据传送到stdout。后面的“-”就是取用前一个命令的stdout。

17 AUG
12 正则表达式

语系对正则表达式的影响: 不同的语系数据的排序不同。
LANG=C:0 1 2 3 4 … A B C D ….a b c d ….
LANG=zh_CN:0 1 2 3 4…a A b B….
如果选[A-Z], 如果语系是zh_CN, 会把b-z也会被选取出来。

特殊符号代表意义
[:alnum:]英文字母大小写以及数字,即0-9, A-Z,a-z
[:alpha:]英文字母大小写,即A-Z,a-z
[:upper:]英文字母大写,即A-Z
[:lower:]英文字母小写,即a-z
[:digit:]数字,即0-9

12.2 grep 的一些高级参数

eg 用dmesg列出内核信息,再以grep找出内含eth的那行(把关键字显色,且加上行号来表示)

在关键字所在行的前两行与后三行也一起找出来显示
-A为after,-B为before

使用grep命令查找特定字符串 grep -n keyword filename 显示行号
eg grep -n 'the' regular_express.txt
eg 反向选择 grep -vn 'the' regular_express.txt
eg 大小写不敏感 grep -in 'the' regular_express.txt
eg 列出以‘the’开头的 grep -n ^the regular_express.txt (^是行首的意思)
eg 列出开头不是英文字母的行 grep -n ^[^a-zA-Z] regular_express.txt
eg 列出行尾结束为小数点的那一行 grep -n '\.$' regular_express.txt
eg 找出哪行是空白行 grep -n '^$' regular_express.txt

多级grep
找出非空行且开头不为’#’的行数:
grep -v '^$' /etc/sysctl.conf | grep -vn '#'
注意第一个grep是-v,而不是-vn,因为行的数字会作为第二个grep的输入。

限定连续RE字符范围
\{n,m\}: 连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符。eg. grep -n 'go\\{2,3\\}g' regular_express.txt (寻找g与g之前有2个到3个o存在的字符串)

12.2.5 sed工具
sed [-nefr] 动作

  • 以行为单位的新增/删除功能 (参数 d)

    • /etc/passwd的内容列出并且打印行号,同时将第2-5行删除:nl /etc/passwd | sed '2,5d'

    • 在第二行后加上“drink tea?”字样(参数a)

    • (注意sed 后面的参数需要用单引号”括起来)

    • 将第2-5行的内容替换成为“No 2-5 number ”(参数c)
      这里写图片描述

    • 直接取出文件中第5-7行(参数 -n)(参数 p:打印,将某个选择的数据打印出来。通常p会与参数sed -n一起运行)

如果没有加上参数-n,则第5-7行会重复输出。 -n在这里代表“安静模式”。
这里写图片描述

  • sed还可以用行为单位进行部分数据的查找并替换的功能。与vim相似。
    sed 's/OldKeyword/NewKeyword/g'

eg. 使用sed的替换功能删除目标文字

去掉10.0.2.15之前的字符:
这里写图片描述

去掉10.0.2.15之后的字符:
这里写图片描述

  • sed还可以直接修改文件内容(参数 -i:直接修改读取的文件内容,而不是由屏幕输出) 这里将文件的每一行结尾为“.”的换成“!”
    这里写图片描述

在文件的最后一行加入“#This is a test.”
sed -i '$a # This is a test' regular_express.txt
($是文末的意思,a的操作是新增,a后面的字符串在新的一行出现)
通过sed直接修改/替换文章,不需要使用vim进行修改,便于大文件(如100万行)的修改。

18 AUG

12.3 扩展正则表达式
eg 去除空白行与行首为#的行列,使用两次grep:
grep -v '^$' regular_express.txt | grep -v '^#'

Improvement - 把两个grep结合起来:
egrep -v '^$|^#' regular_express.txt 注意这里是用 egrep

egrep

  • + : 重复一个或一个以上前一个字符。eg, ‘go+d’ 表示god, good,goood……
  • ?:零个或一个的前一个字符。eg, ‘god?d’ 表示 gd,god
  • |:用或(or)的方法找出数个字符串。eg, ‘gd|good|dog’
  • ():找出“组”字符串。eg, ‘g(la|oo)d’ 查找 glad和good
  • ()+:多个重复组的判别。eg, ‘A(xyz)+C’表示查找A开头C结尾,中间是一个以上的xyz字符串的意思
**[a-z]的反向选择是[^a-z],不是[!a-z]

awk
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
数据处理工具,将一行分成若干个“字段”来处理。其中关键字都是由‘ 单引号括住的,所以awk内嵌命令要用 ” 不能用单引号了。
eg, cat /etc/passwd | awk 'BEGIN {FS=":"} $3 <10 {print $1 "\t" $3}'
分析:在/etc/passwd中是以冒号:来作为字段分割的,该文件中第一字段为账号,第三字段是UID。这里的作用就是查阅第三列小于10的数据,并且仅列出账号与第三列。BEGIN的作用是先预设awd的变量,为了避免一开始的第一行不生效。

12.4.3 文件比较工具

eg 修改/etc/passwd ,删除第四行,替换第六行成为“no six line ”。注意,替换的第六行是原来的第六行,而不是删除第四行之后的“第六行(原第七行)”:cat /etc/passed | sed -e '4d' -e '6c no six line' > passwd.new (如果sed后面要接超过两个以上动作时,每个动作前面要加-e)

diff
用法: diff [-bBi] from-file to-file
(from-file 和to-file可以用 - 替换,代表standard input)
-b 忽略一行中仅有多个空白的区别,如about me 和about (n个空格) me
-B 忽略空白行的区别
-i 忽略大小写的不同

4d3 - 左边的第四行被删除(d)了,基准是右边的第三行
< adm:x:3:4……… 这里是左边(<)文件被删除的那一行的内容
6c5 - 左边的第六行被替换(c) 成右边文件的第五行

cmp
diff是以行为单位比较(多用于纯文本),cmp则是以字节为单位去比较。

patch
制作补丁文件
patch -pN < patch_file 更新
patch -R -pN < patch_file 还原

-p : 后面的N表示取消几层目录的意思。eg: -p0, 比较新旧版的数据时是在同一个目录下,因此不需要减去目录。
-R: 表示还原,将新的文件还原成旧的版本

13.1
执行: bash shell.shsh shell.sh
写script需要注意:

  • #!/bin/bash声明文件内的语法使用哪个shell来执行
  • 声明主要环境变量。比如PATH和LANG,这可以让整个程序在进行时可以直接执行一些外部命令,而不必写绝对路径
  • 告知执行结果。使用exit命令来让程序终端,并且回传一个数值给系统。exit 0.还可以定义exit n反馈错误消息。

给写好的script加上执行的权限:chmod a+x sh01.sh,这样就可以直接执行:./sh01.sh。(加上x权限之前只能用sh sh01.sh执行)

脚本错误检查:
使用sh -n filenmae可以对脚本的语法进行检查。

读入参数:
read -p "please input your name:" username
输出参数:
echo -e "your input is: $username"

  • 需要执行command后得到的参数:使用括号
    eg. date1=$(date --date='2 days ago' +%Y%m%d)
  • 把两个变量拼起来:使用大括号
    eg. file1=${filename}${date1}
  • 计算式:使用双括号
    eg. total=$(($firstnumber*$secondnumber))

13.2.2 script的执行方式区别(source, sh script,./script)
- 如果利用bash 或sh来执行脚本时,该script都会使用一个新的bash环境(子进程)来执行脚本内的命令。就是说,当脚本执行结束后,它的各项变量和操作不会传回父进程中。
- 如果利用source来执行,则是在bash的父进程里来执行命令,此时可以保存各项变量及操作

13.3.1 利用test命令的测试功能

  • test -e /dirname 检查/dirname是否存在。(参数-e)
    这个命令不会显示任何信息,但是最后可以通过$?或&&和||来显示整个结果。test -e /dirname && echo "exist" || echo "not exist"
测试的标志代表意义
-e该文件名是否存在
-f该文件名是否存在且为文件(file)
-d该文件名是否存在且为目录(directory)
-r该文件名是否具有“可读”的权限
-w该文件名是否具有“可写”的权限
-x该文件名是否具有“可执行”的权限
test -z string判定字符串是否为0,若string 为空字符串,则为true
-a两个条件同时成立。例如,test -r file -a -x file,当file同时有rx权限时,才回传true
-o任何一个条件成立。例如,test -r file -o -x file,当file有r或二者x权限时,才回传true
反向状态。例如,test ! -x file, 当file不具有x权限时,回传true

sh05.sh

13.3.1 利用判断符号[ ]

eg. 判断$HOME这个变量是否为空: [ -z "$HOME" ]; echo $? (**注意[]的两端都有空格分隔)。

因为中括号被用在很多地方,比如通配符与正则表达式,所以如果要在bash的语法当中使用中括号作为shell的判断式时,必须注意两端要有空格分隔。

Note:

  • 中括号[]内的每个组件都需要有空格键来分隔,eg $HOME = $MAIL等号两边都有空格分隔
  • 在中括号内的变量/常量,最好都以双引号括号起来. eg [ $name = "yourname" ]中,如果$name的变量值是:my name,则等式会变成:my name = “yourname”,出现三个参数。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值