001-linux基础知识 一、计算机的构成 硬件
1 2 3 4 - 中央处理器- 存储器:磁盘- 输入设备:键盘、鼠标、扫描仪等- 输出设备:打印机、监控器
软件
1 2 - 系统软件:操作系统、数据库管理系统等,- 应用软件:办公软件、游戏软件等
二、操作系统 操作系统(0peratingSystem,简称0S)传统上是负责对计算机硬件直接控制及管理的系统软件。操作系统的功能一般包括处理器管理、存储管理、文件管理、设各管理和作业管理等。当多个程序同时运行时 操作系统负责规划以优化每个程序的处理时间。
1.什么是Linux?
1 2 3 4 5 - 严格来讲应该不是一个操作系统,linux只是一个操作系统中的内核。- 内核是什么?内核建立的计算机软件与硬件之间通讯的平台,内核提供系统服务,比如文件管理,虚拟内存,设备I/O等。 - 通常所说的linux系统又是什么?基于linux内核的GNU操作系统,就是内核与其提供的接口工具。
2.Linux还具有以下特色
1 2 3 - 采用阶层式目录结构,文件规定清楚,容易管理- 支持多种文件系统- 具有可移植性,系统核心只有小于10%的源代码采用汇编语言笔编写,其余均采用c语言编写,因此具有高度一致性,考虑其他操作系统windowsxp/2000等并存于同一台机器上。
3.Linux系统结构
1 Api: 接口 (必须遵循规则, 内核提供一些系统调用的规则)
4.VM:虚拟机 利用虚机以机可以在一台电脑上将硬盘和内存的一部分拿出来虚拟出若干台机器,每台机器可以运行单独的操作系统而互不干扰,这些“新’机器各自拥有自己独立的CMos、硬盘和操作系,可以像使用普通机器一祥对它们进行分区、格式化、安装系统和应用软件等操作,还可以将这几个操作系统联成一个网络。
1 2 3 - Vmwarel www.vmware .com - MicrosoftVirtualPC www.microsoft .com/windows/virtualpc - VirtualBox www.virtualbox .org
虚拟化的特征
1 2 3 4 5 6 7 8 9 10 11 第一:分区 在单一物理服务器上同时运行多个虚拟机; 第二:隔离 每一个虚拟机都与同一个服务器上的其他虚拟机相隔离; 第三:封装 虚拟机将整个系统, 包括硬件配置操作系统以及应用等封装在文件里; 第四:独立性 可以在其他机器上不加修改地使用虚拟机;
虚拟机用途
1 2 当硬件的处理速度越来越快,企业花费重金购买的硬件设备,单一应用不能够,充分利用硬件资源,通过虚拟机在计算机上模拟多套意应用,达到充分利用资源降低成本的目的。 开发测试过程中往往需要搭建多套系统,通过利用虚拟技术,可以在尽可能少的硬件平台模拟出所要的环境,减少开发和测试成本。
分区 挂载
1 2 必须分区 ·/(根分区) ·swap(交换分区,内存2 倍,不超过2 GB) 推荐分区 ·/boot(启动分区,200 MB)
三、Linux目录结构 1./根目录 2./bin系统启动是需要执行文件(二进制),这些文件可以被普通用户使用。 3./boot用于存放加载程序的文件(LILO或GRUB)的文件,在计算机启动时,(如果有多个操作系统,有可能允许你选择启动哪一个操作系统),这些文件首先被装载,这个目录也会包含linux核(压缩文件vmlinuz),但linux和也可以存在别处,只要配置LILO,并且lilo知道linux核在哪儿。 4·/dev设备文件目录。linux下设备被当成文件,这样一来硬件被抽象化,便于读写、网络共享以及需要临时装载到文件系统中,正常情况下,设备会有一个独立的子目录。这些设备的内容会出现在独立的子目录下。Linux没有所谓的驱动符。 5·/etc操作系统的配置文件目录。 6·/home目录包含用户的文件:参数设置文件、个性化文件、文档、数据、 EMAIL、缓存数据等。这个目录在系统升级时应该保留。 7./1ib根文件系统目录下程序和核心模块的共享库。 8·/mnt软盘、光盘、 优盘等外设的預设挂载点。 9·/proc目录整个包含虚幻的文件。它们实际上并不存在磁盘上, 也不占用任何空间。(用1s -l可以显示它们的大小)当査看这些文件时, 实际上是在访问存在内存中的信息,这些信息用于访问系统。 10·/sbin 11·/tmp临时文件。该目录会被自动清理干浄。 12·/usr日录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的 。 这个目录也包含你的Linux发行版本的主要的应用程序,譬如,Netscape。 13·/var目录包含在正常操作中比改变统计,假脱机文件,记录文件,枷锁文件、临时文件和页格式文件等。 14·/root系统管理员的home目录。(也叫超级用或根用户) 15·/opt可选用的应用程序,譬如,REDHAT5.2下的KDE(REDHAT6.0下,KDE放在其他的应用程序中,主执行程序在/usr/bin目录下。 16./lost+found在文件系统修复时恢复的文件
四、虚拟控制台 linux是真正的多用户操作系统,可以同时接入多个用户,远程和本地登陆,也允许同一个用户多次登录,允许用户在同一时间从不同控制台(系统的控制台是与系统直接与相连的监视器和键盘)进行多次登陆。 虚拟控制端口可使用户同时在多个控制台上工作,用户可以在某一虚拟控制台上,进行的工作尚未结束时,切换到另一个虚拟控制台开始另一项工作。例如,开发软件时,可以在一个控制台上进行编辑,在另一个控制台上进行编译,在第三个控制台上查阅信息。
1.IP地址查看
1 2 3 4 5 6 7 8 9 10 11 12 13 - 直接执行ip a - ip -4 a - windows查看IP为ipconfig - 以root用户登录系统 执行命令:ifconfig eth0Link encap:Ethemet HWaddr 00 :0 C:29 :85 :DA:EA inet addr:192.168 .0 .34 Bcast:192.168 .0 .255 Mask:255.255 .255 .0 inet6 addr: fe80::20 c129fffe85:daea,64 Scope:Link UP BROADCAST RUN-NING MdTICAST MTU:1500 Metric:1 RX packets:3926557 errors:0 dropped:0 overruns:0 frame:0 TX packets:40859 errors:0 dropped:0 overruns:0 carrier:0 co11isions:0 txqueuelen:1000 RX bytes;351579699 (335.2 MiB) TXbytes:5029445 (4.7 MiB) Interrupt:67 Base address:0x2024
五、LINUX操作技巧 1.基础技巧
1 2 3 4 5 - 获取历史命令:按[向上箭头] 和[向下箭头] 键可以滚动以前使用过的命令- 命令,文件或路径的补全:键入了文件名、命令、或路径名的一部分,然后按[Tab] 键,会把文件或路径名的剩余部分补全- 图形与文本界面切換图形切换到文本界面(命令行界面) : shift +ctrl +alt +f4 - 文本界面(命令行界面)切换到图形: (shift+)alt +f7
2.Shell提示符
1 2 3 [root@haozhinuo~ ]# [用户@主机名当前目录名称 ]提示符 root为#普通用户为$
3.Linux命令输入规律
1 2 3 命令 () () ·空格作为分割 ·如: # ls -a /home/hzn
4.绝对路径
1 cd/etc/ sysconfig/network-scripts/
5.相对路径
1 2 [root@haozhinuo ~]#cd etc [root@haozhinuo etc]# cd sysconfig/network-scripts/
6.命令热身
1 2 3 4 5 . 代表此层目录 .. 代表上层目录cd : 改变目录, 如cd /home, 表示进入home目录pwd : 显示当前的目录 clear : 清除屏幕上的信息
7.退出
1 2 3 - logout - exit - Ctr1+D(相当于执行exit )
8.重启动
1 2 3 4 5 - reboot - shutdown -r <time> 举例: shutdown -r 3 ---3 分钟之后重新启动组合键 Ctrl+Alt+Del --- (只适用于控制台下)
9.关机
1 2 3 4 - halt - shutdown -h <time> 举例; shutdown -h 3 ---3 分钟之后关机
10./etc/inittab
1 2 3 4 5 6 7 8 9 ·# Default runleve1. The runlevels used by RHS are: - #0 -halt(Do NOT set initdefault to this) - #1 -Single user mode - #2 -Multiuser,without NFS(The same as3, if you do not have networking) - #3 -Fu11 multiuser mode - #4 -unused - #5 -X11 - #6 -reboot(Do NOT set initdefault to this)【表示当前缺省运行级别为5(initdefault)】 - id:5:initdefault: 【如果修改为启动到文本界面,则将id:5中的5修改为为3】
11.光盘挂载
1 2 3 mount /dev/cdrom /mnt umount /dev/cdrom 注意:执行mount和umount操作时,请不要挂载目录中进行操作
12.分区和挂载
1 2 3 fdisk -l 【查看硬盘及分区信息】 df 【显示磁盘挂载及使用情况】 常用参数:df -h
13.目录处理命令:ls
1 2 3 4 5 6 7 8 9 10 11 命令格式: ls[选项] [文件名或目录名] 命令功能: 列出目标目录中所有的子目录和文件 常用选项: -a 显示所有文件,包括隐藏文件 以.开头的文件名都视为隐藏文件 -l 显示详细信息 ll -h 以容易理解的格式列出文件大小(例: IK 234M)
14.错误报错
1 2 3 4 5 英文提示的困惑? Command not found命令找不到 No Such file or directory 没有这样的文件或目录
15.文件新建
1 2 3 4 touch 命令【功能:文件修改和创建】语法: touch 目标文件 举例: touch wxt 【wxt为文件名】
16.vi编辑
编辑模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 一般模式 i,a,o,r【可以直接进入文件编辑】 i键插入,从目前光标所在处插入 a键插入,从目前光标所在下一个字符处插入 o键插入,从目前光标所在下一行插入新的一行 r键 替换当前字符 退回编辑模式,回到一般模式 ESC 存盘:w 不存盘退出:q 存盘退出:wq 强制退出:q! 强制存盘退出:wq! 显示行号:set nu 不显示行号:set nonu 光标移动到第几行:n 上下左右箭头可以移动光标位置 光标移到文件最后一行 G 光标移到文件第一行gg 光标移到该行的最后面$ 光标移到该行的最前面0 査询字符串/word ?word 重复上一次査找n, N(反向査找) 査询字符串(不区分大小写) /word\c 替换当前行s/old/new/g 替换整个文档中的字符串:%s/old/new/g 替换整个文档中的字符串: 1 ,$s /old/new/g 替换a到b行的字符串:a ,bs/old/new/g 删除光标所在行 dd 复制光标所在行 yy 撤销u 将已经复制的数据粘贴 p 删除从光标所在到最后一行 dG 删除从光标所在到该行最后一个字符 d$ 删除从光标所在到该行最前面的一个字符 d0 复制从光标所在到该行最后一个字符 y$ 复制从光标所在到该行由面的一个字符 y0 复制光标向下的多行nyy n,my复制n行到m行 删除光标及光标下的多行 nddn,md复制n行到m行
17.Tree命令
18.文件及目录的基本操作
ls命令
1 2 3 4 5 6 7 【功能:列出目录的内容。该命令类似于Dos 下的dir 命令】 语法: ls [选项] [目录或是文件] 颜色含义 蓝色→目录 绿色→可执行文件 红色→压缩文件 浅蓝色→链接文件
cd命令
1 2 3 4 5 6 7 【功能:改变工作目录】 语法: cd [directory] 备注: cd 或 cd ~到用户家目录 cd .. 上层目录,cd . 在当前目录cd - 上一次进入的目录
pwd命令
1 2 【功能:此命令显示出当前工作目录的绝对路径】 语法: pwd
mkdir命令
1 2 3 4 5 【功能: 创建一个目录 (类似Dos下的md 命令)】 语法: mkdir [选项]目录名称 常用参数: -p递归 mkdir dir1 dir2 dir3 【连续新建3 个文件夹dir1 dir2 dir3】mkdir -p a/b/c【a文件夹目录下有b文件夹,b文件夹下有c文件夹】
rmdir命令
1 2 3 4 【功能:删除空目录】 语法: rmdir[选项]目录名称 常用参数: -p递归删除除空目录 同上mkdir
cp命令
1 2 3 4 5 6 7 8 9 【功能: 将给出的文件或目录拷贝到另一文件或目录中, 就如同Dos下的copy命令一样,功能非常大】 语法: cp[选项]源文件 目录目标文件或目录 常用参数: -r 递归持续复制, 用于目录的复制 -a保持原属性不变 举例: cp /etc/passwd ./ 拷贝passwd文件到当前目录下 cp /etc/passwd ./pass 如果当前不存在pass目录,此时会自动新建一个pass文件夹 cp -ra 123 ./pass
mv命令
1 2 【功能: 为文件或目录改名或将文件或目录由一个目录移入另面一个目录中】 语法:mv [选项]源文件或目录目标文件或目录
rm命令
1 2 3 4 5 6 功能:删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。 对于链接文件,只是删除了链接, 原有文件均保持不变。 语法: rm[选项]文件 常用参数: -f【强制删除】 -i【删除前提示】 -r【递归删除(使用要慎重! )】
cat命令
1 2 3 4 5 6 7 8 9 10 11 【功能: 显示文件内容, 并且支持将多个文件串连接后输出】 注意:该命令一次显示完整个文件,若想分页査看,需使用 more 语法: cat[选项]目标文件 常用参数: -n对所有输出行进行编号 -b与-n相似,但空白行不编号 举例: cat a b 【同时查看a 文件和b文件】 cat -n a 【给a 文本编号】 cat -b a 【编号(但不给空行不参与编号)】 cat -n a b 【给a 文件和b文件一起编号】
head命令
1 2 3 4 5 6 7 【功能:输出文件最前面的几行数据】 语法: head目标文件 常用参数: -n显示前面的几行 举例: head /etc/man .config 默认显示开头前十行 head -3 /etc/man .config 显示开头前3行
tail命令
1 2 3 4 5 6 7 【功能:输出文件的最后部分】 语法: tai1[选项]目标文件 常用参数: -n显示后面的几行 -f持续检测后面的文件内容 tail -f多用来查看日志 其余同head
more命令
1 2 3 4 5 6 7 8 9 10 11 【功能:分页查看】 语法: more目标文件 常用参数: -num:每页显示多少行内容 +num:从多少行开始显示 空格:向下翻一页 Enter:向下一行 /字符串:向下査询 Ctr1十F Ctr1十B向上一页 q退出more
19.设备挂载
每个文件系统都有白己独立的inode, block等信息,这个文件系统要能够连按到目录树才能够被我们使用,这种文件系统与目录树相结合的操作称为挂载。 挂载一定是目录, 该目录为进入该文件系统的入口 。挂载就是将某个未使用的空问或可移动设各的存储空间指向一个目录。
20.补充:
1 2 3 4 - DHCP:自动获取IP- 快捷键:ctrl+shift+ “+” 放大终端 ctrl+c终止 ctrl+d退出 ctrl+l清屏(clear) - vm快照功能
alias 查看系统别名
1 2 3 4 5 6 vi /etc/profile 在文本最后添加alias l =‘ls-l’(如果修改开机提示在这里填入echo hello) source /etc/profile使配置文件生效 echo hello>>passwd >> 追加的意思
1 2 3 4 ·linux远程联接端口为:22端口 touch是创建文件,mkdir创建目录 cp /etc/passwd ~ 复制到家目录 cp -r /etc ~/etc/
002-linux文件查找&压缩 一、find命令 1 2 3 4 5 6 7 8 【在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的査找条件,功能很强大】 语法: find 起始目录寻找条件操作 说明: find 命令从指定的起始目录开始, 速归地控索其各个子目录, 査找满足寻找条件的文件并对之采取相关的操作 常用参数: -name 査找文件名 -user/-uid/-gid/-group 查找相关用户和组 -perm 査找出相关权限的文件 find /home -name "a1'" 【find 找文件名为完全匹配】
通配符号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ? 匹配单个字符 * 匹配0 个或多个字符 [ ] 匹配其中任一个字符 上面都需要加“” 不需要加“”的有:cp ls rm mv 举例: cp a * dir 【把所有开头为a 的文件复制到dir目录下】rm -rf * 【删除所有文件(不能在根目录下操作此命令)】 ls a * 【列出所有以a 开头的文件和目录】cp -r hzn/* wang 【把hzn下所有复制到wang(不包含hzn)】find1 / -name httpd.conf 【按文件名査找】 find /etc /bin -name “*scmn?” 【使用通配符】find /boot/ -pem 755 【等于775 权限的文件或目录】find /home -name “*ab *” 【查找文件名含ab 的所有文件】find /home -name “?b *” 【查找文件名第二个为b 的所有文件】find /home -name “*b ?” 【查找倒数第二个为b 的所以文件】find /etc /bin -name “ ....” 【同时在多个目录下查找】find /home -user hzn 【找出hzn用户的文件】find /home -perm 700 【找出用户权限为700 的相关文件】假使存在a1 b1 c1 c2 b2 a2 find ./ -name “[a -z ]*”【找出含a -z 的字母文件(a1 b1 c1 c2 b2 a2】find ./ -name “[abd]1 ” 【a1 b1 d1】find ./ -name “*[abc ][1 -2 ]” 【a1 b1 c1 a2 b2 c2】
grep命令详解
搜索文件, 并通知用户在什么文件中搜素到与指定的模式匹配的字符串,并打印出所有包含该字符的文本行,在该文本行的最前面是该行所在的文件名; grep家族包括grep、egrep和fgrep:egrep是grep的扩展,支持更多的re元字符;fgrep就是fixed grep或fast grep;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 语法: grep [选项][査找模式][文件名1 ,文件名2 , .....] 常用参数: -i 忽略大小写 -n 输出行号 -v 反向选择 -r 査找含有匹配字符串的文件 -A -B -C 后面都跟阿拉伯数字 -A 是显示匹配后和它后面的n行。 -B 是显示匹配行和它前面的n行。 -C 是匹配行和它前后各n行。 总体来说,-C覆盖面最大。用它保险些。哈哈。这3 个开关都是关于匹配行的上下文的(context)。 grep -r hzn /etc 【从/ etc目录下查找含有hzn字符的文件】grep root passwd grep -i bin passwd【(忽略大小写)查找passwd下bin字符,不分大小写】grep -n bin passwd 【输出存在passwd下bin字符的行号】grep -v bin psswd 【不包含bin的在哪边(反向选择)】grep -r bin ./ 【(找对应目录是否有bin的文件,bin为文件,./ 为目录)】grep -w 【查找全匹配,不包括子字符串】export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8' 【用GREP_OPTIONS来让查找的项醒目】 grep -c "keyword" 文件名【计算匹配的数量】
简介
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
命令格式:grep [option] pattern file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 grep的常用选项: -V: 打印grep的版本号 -E: 解释PATTERN作为扩展正则表达式,也就相当于使用egrep。 或操作 -F : 解释PATTERN作为固定字符串的列表,由换行符分隔,其中任何一个都要匹配。也就相当于使用fgrep。 -G: 将范本样式视为普通的表示法来使用。这是默认值。加不加都是使用grep。 匹配控制选项: -e : 使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符( - )开头的图案。指定字符串做为查找文件内容的样式。 -f : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 -i : 搜索时候忽略大小写 -v: 反转匹配,选择没有被匹配到的内容。 -w:匹配整词,精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线) -x:仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配) -y:此参数的效果和指定“-i”参数相同。 一般输出控制选项: -c: 抑制正常输出;而是为每个输入文件打印匹配线的计数。 --color [= WHEN]:让关键字高亮显示,如--color=auto -L:列出文件内容不符合指定的范本样式的文件名称 -l : 列出文件内容符合指定的范本样式的文件名称。 -m num:当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容 -o: 只输出匹配的具体字符串,匹配行中其他内容不会输出 -q:安静模式,不会有任何输出内容,查找到匹配内容会返回0 ,未查找到匹配内容就返回非0 -s:不会输出查找过程中出现的任何错误消息,-q和-s选项因为与其他系统的grep有兼容问题,shell脚本应该避免使用-q和-s,并且应该将标准和错误输出重定向到/dev/null 代替。 输出线前缀控制: -b:输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数) -H:在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名 -h:禁止输出上的文件名的前缀。无论查找几个文件都不会在匹配内容前输出文件名 --label = LABEL:显示实际来自标准输入的输入作为来自文件LABEL的输入。这是特别在实现zgrep等工具时非常有用,例如gzip -cd foo.gz | grep --label = foo -H的东西。看到 也是-H选项。 -n:输出匹配内容的同时输出其所在行号。 -T:初始标签确保实际行内容的第一个字符位于制表位上,以便对齐标签看起来很正常。在匹配信息和其前的附加信息之间加入tab以使格式整齐。 上下文线控制选项: -A num:匹配到搜索到的行以及该行下面的num行 -B num:匹配到搜索到的行以及该行上面的num行 -C num:匹配到搜索到的行以及上下各num行 文件和目录选择选项: -a: 处理二进制文件,就像它是文本;这相当于--binary-files = text选项。不忽略二进制的数据。 --binary-files = TYPE:如果文件的前几个字节指示文件包含二进制数据,则假定该文件为类型TYPE。默认情况下,TYPE是二进制的,grep通常输出一行消息二进制文件匹配,或者如果没有匹配则没有消息。如果TYPE不匹配,grep假定二进制文件不匹配;这相当于-I选项。如果TYPE是文本,则grep处理a二进制文件,如果它是文本;这相当于-a选项。警告:grep --binary-files = text可能会输出二进制的垃圾,如果输出是一个终端和如果可能有讨厌的副作用终端驱动程序将其中的一些解释为命令。 -D:如果输入文件是设备,FIFO或套接字,请使用ACTION处理。默认情况下,读取ACTION,这意味着设备被读取,就像它们是普通文件一样。如果跳过ACTION,设备为 默默地跳过。 -d: 如果输入文件是目录,请使用ACTION处理它。默认情况下,ACTION是读的,这意味着目录被读取,就像它们是普通文件一样。如果跳过ACTION,目录将静默跳过。如果ACTION是recurse,grep将递归读取每个目录下的所有文件;这是相当于-r选项。 --exclude=GLOB:跳过基本名称与GLOB匹配的文件(使用通配符匹配)。文件名glob可以使用*,?和[...]作为通配符,和\引用通配符或反斜杠字符。搜索其文件名和GLOB通配符相匹配的文件的内容来查找匹配使用方法:grep -H --exclude=c* "old" ./* c*是通配文件名的通配符./* 指定需要先通配文件名的文件的范围,必须要给*,不然就匹配不出内容,(如果不给*,带上-r选项也可以匹配) --exclude-from = FILE:在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容 --exclude-dir = DIR:匹配一个目录下的很多内容同时还要让一些子目录不接受匹配,就使用此选项。 --include = GLOB:仅搜索其基本名称与GLOB匹配的文件(使用--exclude下所述的通配符匹配)。 -R ,-r : 以递归方式读取每个目录下的所有文件; 这相当于-d recurse选项。 其他选项: --line-buffered: 在输出上使用行缓冲。这可能会导致性能损失。 --mmap:启用mmap系统调用代替read系统调用 -U:将文件视为二进制。 -z:将输入视为一组行,每一行由一个零字节(ASCII NUL字符)而不是a终止新队。与-Z或--null选项一样,此选项可以与排序-z等命令一起使用来处理任意文件名。
简述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 -a --text -A<显示行数> --after-context=<显示行数> -b --byte-offset -B<显示行数> --before-context=<显示行数> -c --count -C<显示行数> --context=<显示行数>或-<显示行数> -d <动作> --directories=<动作> -e<范本样式> --regexp=<范本样式> -E --extended-regexp -f<规则文件> --file=<规则文件> -F --fixed-regexp -G --basic-regexp -h --no-filename -H --with-filename -i --ignore-case -l --file-with-matches -L --files-without-match -n --line-number -q --quiet或--silent -r --recursive -s --no-messages -v --revert-match -V --version -w --word-regexp -x --line-regexp -y --color=auto :可以将找到的关键词部分加上颜色的显示
使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,grep -l pattern files :只列出匹配的文件名,grep -L pattern files :列出不匹配的文件名,grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),grep -C number pattern files :匹配的上下文分别显示[number ]行,grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。这里还有些用于搜索的特殊符号: < 和 > 分别标注单词的开始与结尾。 例如: grep man * 会匹配 ‘Batman’、‘manic’、‘man’等,grep \'<man\' * 匹配‘manic’和‘man’,但不是‘Batman’,grep \'<man>\' 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。\'^\' :指匹配的字符串在行首, \'$\' :指匹配的字符串在行尾, 如果您不习惯命令行参数,可以试试图形界面的‘grep ’,如 reXgrep 。这个软件提供 AND、OR、NOT 等语法,还有漂亮的按钮 :-) 。如果您只是需要更清楚的输出,不妨试试 fungrep 。 .grep 搜索字符串 命令格式: grep string filename寻找字串的方法很多,比如说我想找所有以M开头的行.此时必须引进pattern的观 念.以下是一些简单的□例,以及说明: ^M 以M开头的行,^表示开始的意思 M$ 以M结尾的行,$表示结束的意思 ^[0 -9 ] 以数字开始的行,[]内可列举字母 ^[124 ab ] 以1 ,2 ,4 ,a ,或b 开头的行 ^b .503 句点表示任一字母 * 星号表示0 个以上的字母(可以没有) + 加号表示1 个以上的字母 . 斜线可以去掉特殊意义 <eg> cat passwd | grep ^b 列出大学部有申请帐号者名单cat passwd | grep ^s 列出交换学生申请帐号者名单cat passwd | grep \'^b.503\' 列出电机系各年级...grep \'^.\' myfile.txt 列出所有以句点开头的行
使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 1 、查找指定进程命令:ps -ef|grep java 2 、查找指定进程个数命令:ps -ef|grep -c java 或ps -ef|grep java -c 3 、从文件中读取关键词进行搜索,默认是显示的是行命令1 :cat test.txt | grep -f test2.txt 命令2 (**显示行号**):cat test.txt | grep -**n**f test2.txt 作用:输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行,可用于按指定关键词(放到一个文件中)搜索日志文件。 另一种用法:将多个文件之间相同的行输出来 # cd /etc/sysconfig/network-scripts/ # grep "IPADDR" ifcfg-eth0 ifcfg-lo #默认不加参数指定过滤关键字,外加多个文件,只是将多个文件里面有匹配的行输出 ifcfg-eth0:IPADDR=192.168 .1.108 ifcfg-lo :IPADDR=127.0 .0.1 # grep **-f ifcfg-eth0 ifcfg-lo ** #grep -f 文件1 文件2 ,会将多个文件之间相同的行输出出来 ONBOOT=yes -o :只显示被模式匹配到的字符串,而不是整个行 命令:grep -o "you" ab .log # grep "root" /etc/passwd #先看下正常的过滤,会将整个一行过滤出来 root:x :0 :0 :root: /root: /bin/bash operator:x :11 :0 :operator:/root: /sbin/nologin # grep -o "root" /etc/passwd #加o 之后的操作,只过滤关键字出来 root root root root # grep -o "root:.*0" /etc/passwd #加上正则表达式,这样才是正确的用法,不用输出一整行,只是输出一小段 root:x :0 :0 # grep -o "root" -b /etc/passwd -b 和-o 一般是配合使用的,一行中字符串的字符是从该行的第一个字符开始计算,起始值为0 。这里左边的数字就是此关键字在此文件中的起始位置,第一个root出现在0 位置,然后字符字母有一个算一个,你就一个个的向右数吧,下一个root出现在11 位置以此类推。 0 :root11 :root17 :root414 :root4 、从文件中查找关键词,忽略大小写,默认情况区分大小写命令1 :grep 'linux' test.txt 命令2 (从多个文件中查找):grep 'linux' test.txt test2.txt 多文件时,输出查询到的信息内容行时,会把文件的命名在行最前面输出并且加上":" 作为标示符 命令3 (忽略大小写):grep -i 'linux' test.txt 命令:find . -name ".log" | grep -i error | grep -vi "info" 1 )使用find -name 来列出所有log 文件,重定向给grep 2 )使用grep -i 来查找包含error的行3 )使用grep -vi 来查找不包含info的行5 、grep 不显示本身命令: ps aux|grep \[s]sh ps aux | grep ssh | grep -v "grep" #不包含grep ssh这条命令grep -v root /etc/passwd | grep -v nologin #将/etc/passwd,将没有出现 root 和nologin的行取出来6 、-r 递归查找子目录 查找当前目录及其子目录下面包含匹配字符的文件 # grep ‘ab ’ * #在当前目录搜索带'ab' 行的文件 # grep -r ‘ab ’ * #在当前目录及其子目录下搜索'ab' 行的文件 # grep -l -r ‘ab ’ * #在当前目录及其子目录下搜索'ab' 行的文件,但是不显示匹配的行,只显示匹配的文件 # grep -nr BLOG* . # 查找子目录,匹配后输出行号,这里的点表示当前目录 # grep -lr BLOG* . #查找子目录,匹配后只输出文件名 查询不包含某个目录 #grep -R --exclude-dir=node_modules 'some pattern' /path/to /search #不包含txt目录 7 、列出关键字所在行的前几行与后几行也一起显示-A -B -C 很多时候,我们并关心匹配行而是关心匹配行的上下文。这时候-A -B -C就有用了 -A n 后n行,A记忆为(After) -B n 前n行,B记忆为(Before) -C n 前n行,后n行,C记忆为(Center) [root@www ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth' 245 -PCI: setting IRQ 10 as level-triggered246 -ACPI: PCI Interrupt 0000 :00 :0 e .0 [A] -> Link [LNKB] ...247 :eth0: RealTek RTL8139 at 0 xee846000, 00 :90 :cc :a6:34 :84 , IRQ 10 248 :eth0: Identified 8139 chip type 'RTL-8139C' 249 -input: PC Speaker as /class/input /input2250 -ACPI: PCI Interrupt 0000 :00 :01.4 [B] -> Link [LNKB] ...251 -hdb: ATAPI 48 X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048 kB Cache, UDMA(66 )# 如上所示,你会发现关键字 247 所在的前两行及 248 后三行也都被显示出来! 8 、--line -buffered 打开buffering 模式有一个文件是动态的,它不断地添加信息到文件的尾部,而你想要输出包含某些信息的行。即持续的grep 一个动态的流 9 、e 与E区别grep 想同时过滤多个条件或操作错误写法: # netstat -an |grep "ESTABLISHED|WAIT" #默认grep 不支持多条件匹配 正确写法: # netstat -an |grep -E "ESTABLISHED|WAIT" #加上-E 多条件用"" 包起来,然后多条件之间用|管道符分开 tcp 0 52 192.168 .1.108 :22 192.168 .1.104 :54127 ESTABLISHED # ps -aux|grep **-e udevd -e master**|awk {'print $(NF-1)' }|sort |uniq #而-e 呢不用"" 包起来,-e 指定一个匹配条件 /sbin/udevd /usr/bin/salt-master grep -E '123|abc' filename // 找出文件(filename)中包含123 或者包含abc 的行egrep '123|abc' filename // 用egrep同样可以实现 awk '/123|abc/' filename // awk 的实现方式 与操作 grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。10 、-c 统计行数# grep -i "abc" test.txt|wc -l #不分大小写。test.txt里面包含abc 过滤条件的为2 行 2 # grep -yc "abc" test.txt #-c 呢,就是不显示行的内容,直接显示有几行 2 # cat /etc/passwd|wc -l 55 # grep -c "^.*$" /etc/passwd #那么我们除了wc -l 用来统一一个文件有多少行以外,又多了一种统计文件多少行的方法 55 11 、 -m 的使用# cat test2.txt #这是测试文件 abc 1 abc 2 abc 3 abc 4 abc 5 # grep -m 3 "abc" test2.txt #只匹配到了第三行就退出了 abc 1 abc 2 abc 3
与正则表达式结合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 grep的规则表达式: \ 反义字符:如"\" \"" 表示匹配"" [ - ] 匹配一个范围,[0 -9 a-zA-Z]匹配所有数字和字母 * 所有字符,长度可为0 + 前面的字符出现了一次或者多次 ^ #匹配行的开始 如:'^grep' 匹配所有以grep开头的行。 $ #匹配行的结束 如:'grep$' 匹配所有以grep结尾的行。 . #匹配一个非换行符的字符 如:'gr.p' 匹配gr后接一个任意字符,然后是p。 * #匹配零个或多个先前字符 如:'*grep' 匹配所有一个或多个空格后紧跟grep的行。 .* #一起用代表任意字符。 [] #匹配一个指定范围内的字符,如'[Gg]rep' 匹配Grep和grep。 [^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 \(..\) #标记匹配字符,如'\(love\)' ,love被标记为1。 \< #到匹配正则表达式的行开始,如:'\<grep' 匹配包含以grep开头的单词的行。 \> #到匹配正则表达式的行结束,如'grep\>' 匹配包含以grep结尾的单词的行。 x\{m\} #重复字符x,m次,如:'0\{5\}' 匹配包含5个o的行。 x\{m,\} #重复字符x,至少m次,如:'o\{5,\}' 匹配至少有5个o的行。 x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}' 匹配5--10个o的行。 \w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p' 匹配以G后跟零个或多个文字或数字字符,然后是p。 \W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。 \b #单词锁定符,如: '\bgrep\b' 只匹配grep。 POSIX字符: 为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9 ]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9 ]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。 [:alnum:] #文字数字字符 [:alpha:] #文字字符 [:digit:] #数字字符 [:graph:] #非空字符(非空格、控制字符) [:lower:] #小写字符 [:cntrl:] #控制字符 [:print:] #非空字符(包括空格) [:punct:] #标点符号 [:space:] #所有空白字符(新行,空格,制表符) [:upper:] #大写字符 [:xdigit:] #十六进制数字(0-9,a-f,A-F)
使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 例:通过管道过滤ls -l 输出的内容,只显示以a 开头的行。 首与行尾字节 ^ $,^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义! $ ls -l | grep \'^a\' $ ls -l | grep ^a $ ls -l | grep ^[^a ] #输出非a 开头的行,反向选择 $ grep -n '^$' express.txt #找出空白行,因为只有行首跟行尾 (^$) 例:显示所有以d开头的文件中包含test的行。 $ grep \'test\' d* 例:输出以hat结尾的行内容 $ cat test.txt |grep hat$ 例:显示在aa,bb,cc 文件中匹配test的行。 $ grep \'test\' aa bb cc 例:显示所有包含每个字符串至少有5 个连续小写字符的字符串的行。 在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等,就可以使用[a -z ],[A-Z],[0 -9 ]等方式来书写,那么如果我们的要求字串是数字与英文呢?就将他全部写在一起,变成:[a -zA-Z0-9 ]。 $ grep \'[a-z]{5}\' aa $ grep -n '[0-9]' regular_express.txt #取得有数字的那一行 $ grep -n '^[a-z]' regular_express.txt #只输出开头是小写字母的那一行 $ grep -n '^[^a-zA-Z]' regular_express.txt #不输出开头是英文的 $ grep -n '\.$' regular_express.txt #只输出行尾结束为小数点 (.) 的那一行 注意:小数点具有其他意义,所以必须要使用转义字符(\)来加以解除其特殊意义! 例:显示包含ed或者at字符的内容行 命令:cat test.txt |grep -E "ed|at" 例:如果west被匹配,则es就被存储到内存中,并标记为1 ,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(1 ),找到就显示该行。如果用egrep或grep -E,就不用"" 号进行转义,直接写成\'w(es)t.*1\' 就可以了。 $ grep \'w(es)t.*1\' aa 例:显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7 个连续小写字符的字符串的行 命令:grep '[a-z]\{7\}' *.txt 例:查询IP地址、邮箱、手机号 这里用到了-o 和-P 命令 man grep 查看 -o , --only -matching: Show only the part of a matching line that matches PATTERN. -P , --perl -regexp: Interpret PATTERN as a Perl regular expression. 也就是说-o ,只显示匹配行中匹配正则表达式的那部分,-P ,作为Perl正则匹配 192.168 .0.1 abc@163 .com 匹配ABC类IP地址即 1.0 .0.1 ---223.255 .255.254 命令(IP):grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file .txt 或grep -E --color "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>" file .txt 邮箱是任意长度数字字母@任意长度数字字母 命令(邮箱):grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file .txt 手机号码是1 [3 |4 |5 |8 ]后面接9 位数字的 命令(手机号):grep -E "\<1[3|4|5|8][0-9]{9}\>" file .txt 例:任意一个字节 . 与重复字节 . (小数点):代表『一定有一个任意字节』的意思; * (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态 $ grep -n '[0-9][0-9]*' regular_express.txt #找出『任意数字』的行 $ grep -n 'g.*g' regular_express.txt #找出以g行首与行尾的行,当中的字符可有可无 这个 .* 的 RE 表示任意字符是很常见的. 例:限定连续 RE 字符范围 {} 利用 . 与 RE 字符及 * 来配置 0 个到无限多个重复字节 打算找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义才行。 $ grep -n 'o\{2\}' regular_express.txt $ grep -n 'go\{2,5\}g' regular_express.txt #要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串 $ grep -n 'go\{2,\}g' regular_express.txt #想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g
三、进程管理 进程的定义 : 进程是操作系统的概念,每当我们执行个程序时,对于操作系统来讲就创建一个进程,在这个过程中,伴随着资源分配和释放。可以认为进程是一个程序的一次执行过程。进程与程序的区别 : 程序时静态的,它是一些保存在磁盘上得指令的有序集合,没有任何执行的概念 进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。
ps命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 【命令是最基本同时也是非常强大的进程査看命令】 语法 : ps [选项] 査看系统所有进程 :ps aux=ps -aux ps -ef a 所有进程都显示出来; u 有效用户; x 显示没有控制终端的进程 f 完整输出 e 显示所有的进程 au(x) 输出格式: USER : 进程的所有者 PID : 进程ID %CPU : 占用的CPU使用率 %MEM : 占用的内存使用率 VSZ : 占用的.由拟内存大小 Rss : 占用的内存大小 TTY : 终端的次要装置号码 STAT : 进程程状态: START : 启动进程的时间 TIME : 进程消耗CPU的时间 COMMAND : 命令的名称和参数 举例: ps -ef | grep 目标査找的进程 ps -ef | grep ssh ls | grep a
| 管道符号
kill命令
1 2 3 4 5 6 7 8 【通过向进程发送指定的信号来结束进程的】 kill [选项] 进程号kill -9 强行杀掉指定进程举例: ps -ef |grep ssh kill 7828 (前面的数字)或者kill -9 7828 pkill ssh
top命令
1 2 3 4 5 6 动态进程 - top 命令和ps 命令的基本作用是相同的, 显示系统当前的进程和其他状况;但是top 是一个动态显示过程,即可以通过用户按键来不断刷新当前状态- 比较准确的说, top 命令提供了实时的对系统处理器的状态监视- 语法格式:top [-] [d delay] [q] [c] [s] [S] [i] top 之后【按1】
四、压缩包 tar包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 unix系统打包工具tar制作 tar包参数说明: -c,建立新的各份文件;打包 -x,将各份文件解开; 解包 -t,列出各份文件的内容; 査看 -v,在处理文件时显示更多的信息; 显示 -f ,filename指定filename为读出或写人的各份文件的文件名 -z,压缩文件 文件打包语法: tar -cvf 目标文件名.tar 源文件 文件解包语法: tar -xvf 目标文件名.tar 文件压缩语法: tar -zcvf 目标文件名.tar.gz 源文件 tar -zcvf 目标文件名.tgz 源文件 文件解压语法: tar-zxvf 目标文件名.tar.gz tar-zxvf 目标文件名.tgz 举例:将整个/etc 目录下的文件全部打包成为/tmp/etc.tar tar -cvf /tmp/etc.tar /etc 仅打包,不压缩! tar -zcvf /tmp/etc.tar.gz /etc 打包后, 以gzip压缩 ·ar -ztvf /tep/etc.tar.gz 看打包中的文件 tar -tvf /tmp/etc.tar 査看打包中的文件 -特别注意,在参数f之后的文件名是自己取的,我们习惯上都用.tar 来作为辨识 -如果加z参数, 则以.tar.gz 或.tgz 来代表gzip压缩过的tar file -上述指令在执行的时候,会显示一个警告讯息: 那是关于绝对路径的特殊设定。 tar -cvf d.tar Desktop 【.tar 为后缀,Desktop为源文件】 tar -cvf /home/dir1.tar dir2 【把打包文件放到/home 下】 tar -xvf dir.tar 【解包】 tar -xvf dir.tar -C wang 【解包到wang下(-C表示指定路径,wang为路径)】 tar -zcvf dir2.tar.gz dir2 【其中dir2.tar.gz =dir2.tgz) 打包后, 以gzip压缩】tar -zxvf zcw.tgz -C /home/wang 【解压包到/home/wang 】
zip包
1 2 3 4 5 6 7 8 9 10 【将文件打包为zip 格式的压缩文件】 zip filename.zip file 常用参数: -r递归压缩 unzip是从zip 包中解压出某个文件 unzip 文件名.zip unzip 文件名.zip -d 路径 zip sec.zip secwecpt.chmzip -r setup.zip setup 【(setup为目录)压缩setup以及下面的文件】
gzip包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 gzip [选项] 压缩文件名选项: -c 将输出写到标准输出上, 并保留原有文件-d 将压缩文件解压-1 对每个压缩文件,显示压缩文件的大小,未压缩文件的大小压缩比,未压缩文件的名字-f 速归式地査找指定目录并压缩其中的所有文件或者是解压缩.-t 测试,检査压缩文件是否完整-v 对每一个压缩和解压的文件,显示文件名和压缩比。gzip [-cdv...] [-S ...] [file...] gzip 源文件gzip -r 源文件分别压缩文件下面的文件gzip -c 源文件> a .gz 解压缩 gzip -d test .txt .gz gunzip test .gz gzip passwd (会删除源文件)gzip -c passwd >p .gz 压缩pad ,命名为p .gz (源文件不删除)
rpm包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 - RedHat公司提供的软件包封装格式 - rpm是以一种数据库记录的方式来将你所需要的套件安装到你的Liux主机的一套管理程序 。 /etc一些配置文件放置的目录, 例如/etc/crontab /usr/bin一些可执行文件案 /usr/lib-一些程序使用的动态函式库 /usr/share/doc一些基本的软件使用手册与说明文件 /us/share/man一些manpage档案 参数说明: -i, insta11;(安装) -v,査看更详细的安装信息画面 -h,以安装信息栏显示安装进度 -q,仅査询; -a,所有; -U,软件包更新; -e,erase卸裁; - rpm常用命令 安装rpm -ivh vim-4.6 -4 srcrpm 升级rpm -Uvh vim-4.6 -4 src.rpm 卸载rpm -e vsftpd 列出出详细信息 rpm -qi vsftpd 查询rpm -q 软件名称 查询rpm -qa |grep 名称 rpm -qa |grep ftp 列出配置文件rpm -qc 查询所属包rpm -qf文件名(偶尔) - rpm依赖包安装 如果我们在安装的过程当中发现问题, 或者已经知道会发生的同题, 而还是『执意』要安装这个套件时,可以.使用如下的参数『强制』安装上去。 --nodeps使用时机: 如果在安装某个套件时,老是发现rpm告诉你『有属性相依的套件尚未安装』,而又想要直接强制安装这个套件时, 可以加上--nodeps告知RPM不要去检査套件的相依性。 rpm -e vsftp-22.2323 .011 .rpm --nRedeps 注:危险性: 套件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑套件的属性相依,则可能会造成该套件的无法正常使用
五、磁盘管理 mount 命令
1 2 3 4 5 mount /dev/cdrom /mnt cd /mnt /etc/fstab mount -a
df命令
1 2 3 4 5 6 7 8 【功能:检査文件系统的磁盘空间占用情况】 语法: df [选项] 选项: -a显示所有文件系统的磁盘使用情况,包括0块(b1ock)的文件系统, 如/proc文件系统。 -k 以k字节为单位显示 -i 显示i节点信息,而不是磁盘块, . -t 显示各指定类型的文件系统的磁盘空间使用情况 -h 以人们较易阅读的GB、 MB、 KB等格式自行显示
磁常管理
1 2 3 4 5 6 7 8 9 10 11 12 13 du(disk usage)命令 【功能:统计目录(或文件)所占磁盘空间的大小】 语法 : du [选项] [Names...]说明: 该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况,若没有给出Names则对当前目录进行统计, 默认以KB输出 常用参数: -s 对每个Names参数只给出占用的数据块总数 -a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数 -b 以字节为单位歹l1出磁盘空间使用情况(系统缺省以k字节为单位) 。 -k 以1024字节为单.位.fl1出磁盘空间使用情况。 -c 最后再加上一个总计(系统缺省设置)。 -l 计算所有的文件大小,对硬链接文件,则计算多次。 -h 以人们较易阅读的GB、 MB、 KB等格式自行显示 举例: du -sh 查看文件具体大小
补充:
1 2 3 4 PPID复进程 rz 上传window上的文件到linux > 重定向(覆盖)比如:who>2. txt 意思就是把who查询的内容输入到2. txt里面,如果2 里面有内容会被覆盖) >> 追加(不覆盖,追加在内容结尾)ls>> 1. txt在1 内容后追加ls的查询结果
003-linux用户与组的管理 一、 用户与组的管理 常用命令:
1 2 3 4 ·groupadd,groupmod ,groupdel ·useradd,usermod,userdel ·passwd,gpasswd,groups new grp ·id ,who
用户管理: 1.超级用户 Linux系统充通过UID来区分用户权限级别別, UID为0的用户具有超级权限。通过/etc/passwd 来査得UID为0 的用户是root, root用户是系统中超级用户; su 切换用户 su - 切换用户, 连同环境变量一起切换 查看IP的时候可以看二者出区别
2.用户组 在Linux系统中,每个用户帐号都至少属于一个用户组(一般为私有组) ,每个用户组可以包括多个帐号。属于同一用户组的用户享有该组共有的权限 。(主要是文件使用权限)
groupadd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 【功能说明:建立用户组 】 举例: groupadd police 【创建警察组】 语法: groupadd [-g gid] groupname 补充说明:需要建立群组时,可用groupadd指令来完成这项工作 。 相关参数: -g 【gid:指定组ID号】 groupadd -g 600 police1 【创建id号为600的警察1组】 tail /etc/group 【查看组】 root:x:0:root ·第一字段: 组名 ·第二字段:口令,映射到/etc/gshadow文件中; ·第三字段: GID; ·第四字段: 属于该组的用户;
groupmod
1 2 3 4 5 6 7 8 9 10 【功能说明:更改组ID号】 语法: groupmod [-g<组ID号> <-o> ][-n<新群组名称> ] [群组名称] 补充说明:需要更改组ID号或名称时,可用groupmod指令来完成这项工作。 相关参数: -g <组ID号 > 【设置要使用的改组ID号】 groupmod -g 700 【police修改police组id为700】 -n<新组名称 > 设置新的组名 groupmod -n po1 police 【修改police的组名为pol】
groupdel
1 2 3 4 5 【功能说明:删除群组】 语法: groupdel [群组名称] 补充说明: 需要从系统上删除群组时, 可用groupdel指令来完成这项工作 。倘若该群组中仍包括某些用户, 则必须先删除这些用户后, 方能删除群组 groupdel pol 【删除pol组】
useradd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 【功能说明:建立用户帐号】 语法:useradd 参数新建的用户名 补充说明:使用useradd指令所建立的帐号是保存在/etc/passwd文件中 参数说明: -d <登入目录> 指定用户登入时的起始目录 -g <群组> 指定用户所属的群组 -m 自动建立用户的登入目录 -u<uid> 指定用户ID 举例: useradd -g 501 wang3 【添加用户wang3,加到wang组】 (501为组ID,501可以换做具体的组名如wang,wang3为用户) useradd -u 600 wang2 【添加一个ID为600的用户wang2】 useradd -g wang -u 700 wang3 【添加用户wang3,wang3的ID为700,加入wang组】 /etc/passwd root:x:0:0:root:/root:/bin/bash 第一字段:用户名(也被称为登录名) 第二字段: 口令,映射到/etc/shadow文件中; 第三字段: UID;(用户id) 第四字段: GID;(组的编号) 第五字段:用户名全称,这是可选的,可以不设置; 第六字段:用户的主目录所在位置; 第七字段:用户所用SHELL的类型;
usermod
1 2 3 4 5 6 7 8 9 10 11 功能说明:修改用户帐号。 语法: usermod--参数[用户帐号] 补充说明: usermod可用来修改用户帐号的各项设定 参数说明: -g <群组> 修改用户所属的群组 -u<uid> 修改用户ID -U 解除密码锁定 -L 锁定用户密码,使密码无效 举例: usermod -g 501 wang4 【修改wang4的群组为501 】 usermod -u 800 wang5 【修改wang5的用户id为800 】
userdel
1 2 3 4 5 6 7 功能说明:删除用户帐号。 语法: userde1[-r ][用户帐号 ] 补充说明: userde1可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件。 参数说明: -r 删除用户及其home目录。 举例: userdel -r wang5 【删除wang5用户及其家目录】
密码修改:passwd
1 2 3 4 5 6 7 8 9 10 语法 : passwd[用户账号] passwd wang 【修改wang的密码】 passwd什么都不加 修改root密码 举例: 该命令用于修改用户的密码,使用方法 :[root@haozhinuo-]# passwd zhangsan Changingpassword foruserzhangsan. NewUNIX password: Retype newUNIX password: passwd :a11 authentication tokensupdated successfully
设定组密码
取消组密码
1 2 gpasswd -r <group-name> 说明:取消密组码后, 只有成员才可以通过new grp 命令切换入该组。
一个用户加入多个用户组
1 2 3 gpasswd -a rong wxt 或者 usermod -G rong wxt
设定组管理员(系统管理员)
1 gpasswd -A<user > <group_name >
添加组成员
1 2 gpasswd -a<user )<group -name > gpasswd -a wang1 wang 【把用户wang1添加到wang组里面】
删除组成员
1 2 3 gpasswd -d<user ) <group -name > 举例: gpasswd -d wang1 wang 【把用户wang1从wang组里面删除】
査看用户属于哪些组
1 2 3 4 groups [usermame] 举例: groups wang1 【wang1 为用户】 注:一个用户可以分属于不同的用户组
username是要査看的用户名 如果省略则査看自己所属的用户组
用户切换所属组
1 2 3 4 newgrp [group] 【使用newgrp 命令在所属的用户组中切换】 注: 1 .group参数给出要切换到的目标用户组, 如果没有给出该参数, 则切回登录时所在的工作组。2 .要离开新的有效群组时,输入【exit 】即可
id
1 2 3 4 5 6 7 8 9 【功能说明:显示用户的ID,以及所属群组的ID】 语法: id [-gGnru ][--help ][--version ] [用户名称] 举例: id wang1 【wang1为用户名】 补充说明: 1.id会显示用户以及所属群组的实际与有效ID 2.若两个ID相同, 则仅显示实际ID 3.若仅指定用户名称,则显示目前用户的ID
who
1 2 3 4 【功能说明:主要用于查看当前在线上的用户情况】 补充说明: 1 .显示系统中有那些使用者正在上面,显示的资料包含了使用者 ID, 使用的终端机, 从哪边边连上来的,上线时间,呆滞时间, CPU 使用量,动作等等。2 .直接输入who,显示的IP 为window下的IP (虚拟机的缘故)
配置文件
1 2 3 帐号信息 密码信息 用户 /etc/passwd /etc/shadow 组 /etc/group /etc/gshadow【了解】
二、 文件与目录管理 访问权限 1.Linux系统中的每个文作和目录都有访问许可权限,用来确定谁可以通过何种方式和目录进行何种访问和操作; 2.文件或目录的访问权限分为只读,只写和可执行三种; 3.文件或目录被创建时, 文件所有者自动拥有对该文件的读、写和可执行权限; 4.每一文件或目录的访问权限都有三组, 每组用三位表示, 分别为:文件属主的读、写和执行权限;与属主同组用户的读、写和执行权限;系统中其他用户的读、写和执行权限;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 d rwx r-x r-x 2 root root 4096 01 -24 10 :28 Desktop ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 1 、表示文件的类型,“d'表示该文件为目录,也就是通常意义的文件夹, ' -'' 表示该文件是一般文件,“1 ”表示该文件为一个链接, 也就是通常以上的快捷方式2 、表示文件所有者的权限, r为读权限, w为写权限, x为执行权限3 、表示文件所属组的权限, r, w, x含义同上。4 、表示其他人对该文件拥有的权限, r, w, x含义同上。5 、表示连接数; (表示为连接占用的节点,跟连接档比较有关)6 、表示文件拥有者7 、表示文件所属组8 、表示文件的大小 9 、表示文件最后修改日期10 、文件名称 用ls -l(ll)命令可以显示文件或目录的详细信息 例如: $ls -l sobsrc.tgz -rw-r--r-- 1 root root 483397 Jul 15 17 :31 sobsrc.tgz 最左边的一列为文件的访问权限,第一个字符指定了文件类型,其他位字符指定访问权限:横线代表空许可(无权限),r代表只读,w代表写,x代表可执行。 例如上例中: - rw- r-- r-- 普通文件 文件主 组用户 其他用
chmod命令 【权限修改 】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 【用于改变文件或目录的访问权限】 有两种用法: 1. 一种是包含字母和操作符表达式的文字设定法2. 另一种是包含数字的数字设定法文字设定法: chmod [+|-|=] [mode] 文件名... u表示用户 g表示组 o表示其他组 a表示所有 chmod u-x wxt 用户去掉一个执行权限(x) chmod g+r wxt 组加上可读权限 chmod o+w wxt 其他组加上可写权限 chmod a+x wxt 所有加上可执行权限(可以写成chmod +x wxt) chmod u-x,o+r wxt 可以同时生效(记得加逗号) 数字设定法: 常用参数: -R递归 chmod -R 450 wxt修改wxt以及wxt下面的文件的权限 数字设定法 chmod [mode] 文件名... chmod 450 wxt r=4 w=2 x=1 -=0 -rw-------(600 ) --只有属主有读写权限 -rw-r--r--(644 )--只有属主有读写权限, 而属组用户和其他用户只有读权限 -rwx------(700 )--只有属主有读、写、执行权限 -rwxr-xr-x(755 )--属主有读、写、执行权限,而属主用户和其他用户只有读、执行权限 -rwx--x--x(711 )--属主有读、写、执行权限,而属组用户和其他用户只有执行权限 -rw-rw-rw-(666 )--所有用户都有文件读、写权限 -rwxrwxrwx(777 )--所有用户都有读、写、执行权限
归属修改 文件与目录的归属是指文件的所有者(即用户)与所属的组, 归属决定了文件与目录的使用者的权限划分
chgrp
1 2 3 4 5 6 7 8 9 【功能: 改变文件或目录所属的组】 语法: chgrp [选项] group filen1me 常用参数: -R递归修改 举例: chgrp hzn a 【修改a的组名为hzn】 chgrp gname /home/ourteams 【修改ourteams用户家目录所属组为gname】
chown命令
1 2 3 4 5 6 7 8 9 【功能:更改某个文件或目录的属主和属组,这个命令也很常用】 语法: chown [选项] user [:group] 文件 常用参数:-R 递归修改 chown hzn :hzn wang 【同时将wang 的所属用户以及所属组都改为hzn (改别的也行hzn :root )】 chown hzn wang 【改wang 所属用户改为hzn 】
三、链接ln 1.链接类似于wmdows中的快捷方式, 创建链接实际上是给系统中已有的某个文件或目录指定另外一个可用子访同它的名称,对子这个整的文件空,我们可以为之指定不同的访同权限, 以控制对信息的共早和安全性的问题。 2.如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用打一大堆的路径名,而且,即使我们删除这个链接,也不会破坏原来的目录。
ln命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 语法:ln 【选项】目标【链接名】 常用参数:-s软链接,类似与windows下快捷方式 链接有两种: 一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。建立硬链接时,链接文件和被链接文件必需位于同一文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。 软链接: ln -s 原件(绝对路径) 目标文件举例: ln -s /etc/passwd p2 【把/etc/passwd 进行软链接,快捷方式为p2】 可以cat p2 硬链接(硬链接不常用): ln passwd p1 硬链接没有-s
004-linux环境搭建 网络管理命令
1 2 hostname [査看主机名称] hostname haozhinuo 【设置主机名】
设置网络配置
1 ifconfig eth0 210.34 .6 .89 netmask 255.255 .255 .0
ping
主机名修改 修改主机名:修改以下两个文件之后,重新启动机器 ,主机名要保持一致【在修改配置文件之前建议先各份】
1 2 3 4 5 6 7 8 9 10 [root@wm~]#cat /etc/sysconfig/network NETWORKKING =yes NETWORKKING_IPV6 =no HOSTNAME =hzn[root@wm~]#cat /etc/hosts 127.0.0.1 hzn localhost ::1 localhost6.localdomain6 localhost6
工作实践: 修改 hostname
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 suse11修改hostname 1、修改当前的Hostname可以用 hostname myname 此时只是修改了内存内部的,下次启动又恢复了 2、机器在启动的时候会调用/etc/rc.d/boot.localnet 脚本看后面的附录,这个脚本会判断当前的$HOSTNAME变量是否设置,没有设置就会读取/etc/HOSTNAME 来设置主机名 3、因此要修改 hostname 3.1修改 /etc/HOSTNAME 文件 3.2修改当前的$HOSTNAME变量 3.3停掉/etc/rc.d/ boot.localnet 3.4启动/etc/rc.d/boot.localnet 因此执行脚本如下 export HOSTNAME=myname echo $HOSTNAME>/etc/HOSTNAME /etc/rc.d/boot.localnet stop /etc/rc.d/boot.localnet start
工作实践 :IP地址修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 1.设置静态IP地址 使用setup(直接输setup) 2.修改配置文件: cd /etc/sysconfig/network-scripts ls vi ifcfg-eth0 修改之前: DEVICE =eth0BOOTPROTP =dhcpHWADDR =00:0C:29:B0:64:81ONBOOT =yes TYPE =Ethernet修改之后: DEVICE =eth0BOOTPROTP =noneHWADDR =00:0C:29:B0:64:81ONBOOT =yes TYPE =EthernetNETMASK =255.255.255.0IPADDR =192.168.1.161GATEWAY =192.168.1.1修改之后需要重启网卡或重启: service network restart 【网卡重启】 中兴IP增加: ip addr add 30.1.170.133/24 dev eth1 上面: /24对应的掩码是255.255.255.0 /16对应的掩码是255.255.0.0 加默认网关: route add default 30.1.170.254 netmask 255.255.255.0 网络管理命令:route 【用来产生和修改路由表】 linux: route -n windows: route print
netstat -anp
1 2 3 4 5 【查看端口是否启动】 显示网络连接、路由表和网络接口信息 常用参数: -an -a(all)显示所有选项 -n以网络IP地址代替名称
echo命令
1 2 3 4 5 6 【功能:在显示器上显示一段文字,也可以显示环境变量的名字】 如: 1. echo $PATH2. name=a echo $name 结果显示a
date命令
1 2 3 4 5 6 date +%Y%m%d date +%Y-%m-%d 【功能:显示和设置系统日期和时间】 修改时间 date -s date -s 10 :46 :00 修改时间
管道符“|”
1 用来隔开两个命令,管道符左边命令的输出会作为管道右边的命令的输入
wc命令
1 2 3 4 5 6 【功能:打印出文件中字符行数、字节数、单词个数等】 常用参数: -l 【打印出行数】 wc /etc/ passed 【显示字符行数、字节数、单词个数等】 wc -l /etc/ passwd 【只显示行数】 举例: 用的比较多的grep -n root /etc/ passwd |wc -l
diff命令
1 2 3 【功能:比较两个文件的不同】 diff a b 【比较a与b的不同(不适用)】 vimdiff a b 【(这个比较适用)】
history命令
1 2 3 4 【功能:査看历史记录】 使用历史命令: !序号 history !696
在线帮助 man命令
–help选项 :
whereis命令
chkconfig命令 :【服务开机自启动】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 【功能: 检査,设置系统的各种服务】 常用参数: chkconfig 服务名 on /off chkconfig sshd off chkconfig sshd on chkconfig chkconfig chkconfig chkconfig sshd
启动服务
1 2 /etc/linit.d/sshd restart ( stop start status) service sshd restart (stop start status)
系统资源査看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (top也可以查CPU和内存信息) 査看CPU信息: cat /proc /cpuinfo 査看内存信息: cat /proc /meminfo 査看1inux版本类型: cat /etc/issue lsb_release 査看1inux的位数 getconf LONG_BIT 査看系统类型 uname -a
远程连接乱码解决
1 2 3 4 5 6 - 乱码: /etc/profile中添加 export LC_ALL =zh_CN.GBKexport LC_ALL =en_US.GBK- 执行source /etc/profile 连接工具选择字符集 UTF-8
工具:
1 2 3 4 5 6 7 8 9 10 11 12 - Secure CRT 强大的Windows终端模拟器软件,支持远程登录、重新登录、序列号、 TAPI协议和SSH(SecureShe11,安全外壳) SSH可以提供密码保护的登录和数据传输等, 可进行完全定制,使用简便,还支持密码、 RSA和TIS,其中支持地密码有B1owfish、 DES、3 DES和RC4,可使用ZModem进行安全文件传输,其他新功能还有: x11重定向、多种压缩等。 URL: http: - Putty putty是一个Telnet、SSH、rlogin、纯TCP以及串行口连接软件, 较早的版本仅支持Windows平台, 在最近的版本中开始支持各类unix平台, 并打算移植至Mac 0 S X上,,PuTTY为一-开放源代码软件,主要由Simon Tatham维护,,Putty是一-个免費的、 Wi11lows32平台下的telnet、r1ogin和ssh客户端,但是功能丝毫不逊于商业的telnet类工具。 - Secure FX SecureFX支持三种文件传输协议: FTP、 SFTP和FTP,overSSH2。它可以提供安全文件传输,无论您连接的是任何一种服务器,它都能提供安全的传输服务。 URL:http: - FileZilla FileZi11a是一种快速、 可信赖的FTP客户端以及服务器端开放源代码空式,具有多种特色、直觉的接口,可控性、有条理的界面和管理多站点的简化方式使得Filezi11a客户端版成为一-个方便高效的FTP客户端工具,而FileZi11a Server则是一个小巧并且可靠的支持FTP&SFTP的FTP服务器软件, FileZi11在2002 年1 1 月获选为当月最住推荐专案。
VSFTP安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - VSFTP简介 VSFTP是一个基子GPL发布的类Unix系统上使用的FTP服务器软件,它的生称是Very Secure FTP从此名称可以看出来,编制者的初衷表是代码的安全 特点: 它是一个安全、高速、稳定的FTP服务器 vsftpd安装 步骤: mount /dev/cdrom /mnt cd /mnt cd /Server ls |grep ftprpm -ivh vsftpd-2.0.5-16.el5.i386.rpm rpm -qa |grep vsftpd service vsftpd start或者/etc/init.d/vsftpd start或者service vsftpd stop 测试: - 在windows打开IE输入: ftp://ip/ - 从windows中拷贝文件到ftp中 - 使用FTP客户端工具 VSFTP配置文件 步骤: vi /etc/vsftpd/ftpusers (进去删除root,或者在root前加#号)【设置用户是否允许使用vsftpd登录】 vi /etc/vsftpd/user_list (进去删除root,或者在root前加#号)【vsftpd userlist,可配置】 service vsftpd restart 点开FileZilla,输入linux的ip,用户名,密码,端口号为21
WEB服务器安装
常见的web服务器
1 2 3 4 5 6 PHP:httpd (apache)、nginx tomcat:jsp+html win :IIS 客户端 IE、firefox、chrome、手机(浏览器)Browser
Apache安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 步骤: cd /root/setup tar -zxvf httpd-2.2.4.tar.gz cd httpd-2.2.4./configure make make install rpm -qa |grep httpd Apache配置: vi /usr/local/apache2/conf/httpd.conf :/ServerName 按n向下查找 把 :/listen \c 按n向下查找Listen 80 把80改为88;(此为改端口号) :wq /usr/local/apache2/bin/apachectl start浏览器打开http://192.168.184.130 :88 /
JDK安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 步骤: 第一步 cd /root/setup/ chmod u+x jdk-6u1-linux-i586-rpm.bin ./jdk-6u1-linux-i586-rpm.bin 空格到最后 yes rpm -ivf jdk-6u1-linux-i586.rpm rpm -qa |grep jdk rpm -qa |grep jdk(查看JDK版本) 第二步 vi /etc/profile G到最后添加 JAVA_HOME =/JAVA_HOME=/usr/java/jdk1.6.0_01CLASSPATH =$JAVA_HOME /lib:$JAVA_HOME/jre/libPATH =$PATH :$JAVA_HOME/bin:$JAVA_HOME/jre/binexport PATH CLASSPATH JAVA_HOME:wq source /etc/profile echo $JAVA_HOME
MySQL安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cd /mnt ls |grep DBI rpm -ivh perl-DBI-1.52-2.el5.i386.rpm cd /root/setup rpm -ivh MySQL-client-community-5.0.37-0.rhel4.i386.rpm rpm -ivh MySQL-devel-community-5.0.37-0.rhel4.i386.rpm rpm -ivh MySQL-server-community-5.0.37-0.rhel4.i386.rpm rpm -qa |grep -i mysql(查看是否安装) 测试与密码修改: mysql -uroot -p(使用密码登录)【或mysql -uroot -p密码】 use mysql;show databases ;(查看数据库)show tables ;(查看有哪些表)update user set password =password ("123456" )where user ='root' ;flush privileges ;(使设置生效)exit (退出) 卸载: 使用rpm -qa |grep mysql查找mysql服务 rpm -e
TOMCAT
1 2 3 4 5 6 7 8 9 10 11 12 端口号8080 netstat -anp |grep 8080 sh version .sh (这个命令不要执行权限也可以运行sh 文件)步骤: tar -zxvf apache-tomcat-5.5 .28 .tar.gz cp -R apache-tomcat-5.5 .28 /usr/local/tomcatcd /usr/localcd tomcatcd bin./startup.sh netstat -anp |grep 8080 ./shutdown.sh
oa步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 cd /root/setupunzip oa.zip cd oacp -R /root/setup/oa /usr/local /tomcat/webapps cd /usr/local /tomcat/webappsll(看到redmoonoa.sql) mysql -u root -p123456 source /usr/local /tomcat/webapps/oa/setup/redmoonoa.sql; show databases;(看数据库是否导入) cd /usr/local /tomcat/webapps/oacd WEB-INF /vi log4j.properties log4j.appender.R.File =F:/oa/log /oa.log log4j.appender.R.File =/usr/local /tomcat/webapps/oa/log /oa.log cd /usr/local /tomcat/webapps/oa/WEB-INF /classesls vi cache.ccf 修改之前jcs.auxiliary.DC.attributes.DiskPath=F:/oa/CacheTemp 修改之后jcs.auxiliary.DC.attributes.DiskPath=/usr/local /tomcat/webapps/oa/CacheTemp cd ..vi proxool.xml 修改之前<property name="password" value="myoa888" />^M 修改之后<property name="password" value="123456" />^M 下面还有一个一样的 cd /usr/local /tomcat/bin./shutdown.sh ./startup.sh http:
补充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0 .0 .1 每台机子都一样,为自检IP(就是自身)两种子网掩码: 255.255 .255 .0 (最多255 人) 255.255 .0 .0 (不够就用这个掩码) 一个系统如linux在安装的时候需要配IP,子网掩码(netmask),以及网关(netway) IP:192.168 .184 .130 192 位置最大为255 192.168 .184 相当于一个班,而130 为班里的一个同学,是唯一的最大也为255 子网掩码一样,为一个班的,同一网段的,可以互相通讯。同网段IP前面一样,比如255.255 .0 .0 下,则192.168 .1 .5 中192.168 就不变。 service network restart 网关重启(start,stop,status) route查看路由信息(网关)Gateway netstat -anp |grep 22 查看22 端口 FTP的端口号为21
linux 如何截取一段时间内log日志 1 2 3 4 5 6 7 8 9 10 11 情景一 日志文件较大,想直接连接精确地查询某段时间内的日志 解决方案: sed -n '/2019-05-31 15:00:01/,/2019-05-31 15:05:01/' p /root/toolspace/tomcat7/logs/catalina.out 情景二 日志文件较大,想直接连接精确地查询某段时间内的日志并将其截取到新建的文件中,便于下载查看交流 解决方案: sed -n '/2019-05-31 15:00:01/,/2019-05-31 15:05:01/' p /root/toolspace/tomcat7/logs/catalina.out >/root/toolspace/tomcat7/logs/catalinanew.out 情景三 例如日志时间格式非‘2015 -05 -04 09 :25 :55 ’而是‘22 /Feb/2019 :15 :57 :00 ’ 那么可以使用在 / 前使用转移符 \ 解决案例 sed -n '/22/Feb/2019:15:00:01/,/22/Feb/2019:15:05:01/' p /root/toolspace/tomcat7/logs/catalina.out >/root/toolspace/tomcat7/logs/catalinanew.out
Linux下文本转为图片 有时候在Linux下将文本文件直接打印出来会出现对不齐的现象,特别是有空格时,例如想将CLUSTAL比对后的结果打印为图片时,直接打印位置会错乱。这里提供一种有效的解决办法: enscript安装包:或者yum install enscript
enscript-1.6.6-6.el7.x86_64.rpm
直接用管道:
1 2 3 4 5 enscript -B -p - good.txt | ps2pdf - | convert -density 300 - output.png #这个生成的图片是透明的 enscript -B -p - sar-all.txt | ps2pdf - |convert -background "rgb(255,251,240)" -extent 600 x800 - output.png; #extent生成背景布尺寸为600x800;background背景图为乳白色 convert output -0. png output -1. png output -3. png output -3. png output -4. png output -5. png output -6. png -append result.png #纵向合并图片 #其中good.txt是输入文本文件;output.png是输出png文件名
分步执行:
1 2 3 4 5 6 7 8 9 10 2.1 先将文本转化为ps 格式 使用linux 下工具enscript enscript -p output .ps -B good .txt # -p 接输出文件名,-B 表示不将页码文件名等文件信息打印到图片中 2.2 再将ps 转pdf ps2pdf 安装包:或者yum install ImageMagick 使用linux 下工具ps2pdf ps2pdf output .ps output .pdf
ImageMagick-6.7.8.9-15.el7_2.i686.rpm
ImageMagick-6.7.8.9-15.el7_2.x86_64.rpm
1 2 3 4 5 6 7 2.3 再使用ImageMagick中的convert可以使用sudo aptitude install imagemagick安装imagemagick 安装好后直接运行以下代码即可将pdf文件转化为300 相素的png图片 convert -density 300 output.pdf output.png # 如果有多页,则打印为多个png文件 最终结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 https://www.baidu.com/link?url=jlgQCY_NSnRRfPbn4BgRXNHkzGorb_KfOkfIvTHv3Sw1of9qubKAsH8i0UKlwxGr&wd=&eqid=b147f39500005df9000000035e3be27b linux – 使用ubuntu上的convert 进行填充调整图像大小 我正在使用convert 命令来调整图像大小 有两个版本 以下是第一个,结果图像保持纵横比,但图像不一定是nxn convert temp.jpg -resize nxn temp.jpg第二个版本 convert temp.jpg -resize nxn! temp.jpg它不保留纵横比. 我想要的是保持纵横比,并用所需的RGB值填充图像的其余部分,以实现nxn的大小 有任何想法吗? 谢谢 解决方法 在调整大小后,您需要使用-extent直接设置画布的大小,并且新创建的区域将填充您设置-background 的任何内容. 因此,如果您希望填充为洋红色,请执行以下操作: convert image .png -resize 100x100 -background "rgb(255,255)" -extent 100x100 out.png如果您希望图像显示在输出图像的“中间”,并且填充边均匀分布在两侧,请添加重力中心,如下所示: convert image .png -resize 100x100 -gravity center -background "rgb(255,255)" -extent 100x100 out.png因此,如果我们从一个宽的蓝色图像开始,即300 ×100 ,并且无法在正方形中正确拟合,如下所示: 我们用这个调整大小: convert image .png -resize 100x100 -gravity center -background "rgb(255,255)" -extent 100x100 out.png 我们会得到这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 https: #得到一个图片的尺寸 identify test.png #结果为: #test.png PNG 178 x15 178 x15+0 +0 16 -bit PseudoClass 65536 c 2.28 kb #使用 shell identify test.png | cut -d ' ' -f 3 | cut -d 'x' -f 1 identify test.png | cut -d ' ' -f 3 | cut -d 'x' -f 2 #1 、压缩一个图片,限定高度为 60 , 宽高比例不变,但如果宽大于 90 ,截取中间一段 #convert source.jpg -resize x60 result_60.jpg #截图 convert result_60.jpg -crop wxh+dx+dy result_60.jpg #w 为要截取图片的宽 #h 为要截取图片的高 #dx,dy 是开始截取的偏移位置,以左上角为原点 #拼图 #横向拼接 convert 1. jpg 2. jpg 3. jpg +append result.jpg #纵向拼接 convert 1. jpg 2. jpg 3. jpg -append result.jpg #256 色 png 压缩 convert -strip -depth 8 -colors 256 soure.png result.png advpng -z -4 result.png 图片上写字 convert source.jpg -font xxx.ttf -fill red -pointsize 48 -annotate +50 +50 @text.txt result.jpg #使用字体 xxx.ttf, 字体用红色填充,字体 48 pixel, 位置(50 ,50 ), 文字在 text.txt 文件中 #图片上画长方形 convert source.jpg fill none -stroke red -strokewidth 3 -draw rectangle 50 ,50 100 ,100 result.jpg #还一个线宽为 3 ,颜色为红色,从 50 ,50 到 100 ,100 的正方形,不填充 #画线为 -draw line 50 ,50 100 ,100 #把图片合并成 PDF convert 1. jpg 2. jpg +compress res.pdf
005 1 2 3 4 5 6 7 8 9 10 1 、READMEfstest的时候,解压版本后,目录下有这几个文件: [root@ host10242493 pjd-fstest-20080816 ]# ls fstest.c LICENSE Makefile README tests 就应该查看Makefile和README里面的内容 最后发现需要在该目录下执行:make shell脚本curl命令,会出现有些链接,链接不上的问题: 修改系统参数解决: sysctl -a 查看系统参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 、日志定时打包,定时删除[root@dev-41 logrotate.d] /mnt/ log/hyperkv/m etaparser/hyperkv.INFO / opt/KV/ nohup.out {notifempty copytruncate daily rotate 3 missingok dateext compress sharedscripts } 注意: ·上面的hyperkv可以自定义命名 ·/mnt/ log/hyperkv/m etaparser/hyperkv.INFO和/ opt/KV/ nohup.out为真实日志路径 ·rotate 3 (3 表示:3 天删除日志) crontab -e中加入: 30 02 * * * /usr/ sbin/logrotate -f / etc/logrotate.d/ hyperkv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 3、安装ftp: 1、yum install vsftpd 4.创建用户 (1)首先要启动服务 service vsftpd start (2)创建用户 adduser -s /bin/bash -d /mnt/xufx/ftp xufx passwd xufx 5.vsftpd的配置 安装完之后在/etc/vsftpd/路径下会存在三个配置文件。 vsftpd.conf: 主配置文件 ftpusers: 指定哪些用户不能访问FTP服务器,这里的用户包括root在内的一些重要用户。 user_list: 指定的用户是否可以访问ftp服务器,通过vsftpd.conf文件中的userlist_deny的配置来决定配置中的用户是否可以访问,userlist_enable =YES ,userlist_deny =YES ,userlist_file =/etc/vsftpd/user_list 这三个配置允许文件中的用户访问FTP。 (1)登录ftp后会发现,用户可以访问其他目录,并且具有mpsp组的权限,这样做是不允许的,我们需要将用户的访问范围控制在其主目录下。方法如下: a. vi /etc/vsftpd/vsftpd.conf进入ftp配置文件目录并编辑此文件, anonymous_enable =NO chroot_list_enable =YES chroot_list_file =/etc/vsftpd/chroot_listchroot_local_user =NO userlist_enable =YES 最后加上: userlist_deny =NO userlist_file =/etc/vsftpd/user_list(2) vi /etc/vsftpd/vsftpd.chroot_list [root@dev-21 vsftpd]# vi vsftpd.chroot_list xufx (3) vi /etc/vsftpd/user_list 最后加入xufx (4) ftp的ip+端口的登录方式:ftp 10.244.76.84 811
1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 、查看内存泄露:[root@ sdosspststorage10 my]# ps -ef|grep fuse|grep -v grep root 10223 1 8 09 :04 ? 00 :53 :40 /mnt/data2/ossfuse/sdoss/weed -v=4 -http=true -log_dir=/mnt/data2/ossfuse/log ossfuse -bucket=fusebucket -mountpoint=/mnt/data2/ossfuse/test -ossendpoint=osspstxg.cnsuning.com [root@ sdosspststorage10 my]# top -p 10223 top - 19 :28 :09 up 178 days, 23 :46 , 10 users, load average: 1.37 , 1.23 , 1.18 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.9 %us, 6.1 %sy, 0.0 %ni, 92.9 %id, 0.0 %wa, 0.0 %hi, 0.0 %si, 0.1 %st Mem: 16334344 k total, 15974360 k used, 359984 k free, 59644 k buffers Swap: 10485752 k total, 5624620 k used, 4861132 k free, 3207248 k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10223 root 20 0 3031 m 456 m 3564 S 0.0 2.9 53 :40.33 weed RES值:应该变化不是太大,如果有增长,之后还是会降下来的,不降就是内存泄露
1 2 3 4 5 5 、ssh超时:vdbench免密拷机的时候,会无缘无故的退出,之后发现ssh超时,需要注释下面两行,重启sshd [root@sdfspstapp01 mnt]# cat /etc/ssh/sshd_config |grep -E "ClientAliveInterval|ClientAliveCountMax" #ClientAliveInterval 600 #ClientAliveCountMax 0
1 2 3 4 6 、linux命令:将脚本放到 /usr/local /sbin/目录下可以作为命令使用 select * from filemap limit 1 \Gcurl 带-w "%{http_code}"这个参数直接返回code
001-作业 基础篇:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 1. 新建组gname,设定组的id号为800 ,查看组的信息;groupadd -g 800 gname tail /etc/group 2. 新建用户ourteams,用户属于root组,用户id设置为790 ,给用户设定密码为123456 ,查看该用户的信息;useradd -g root -u 790 ourteams passwd ourteams id ourteams 3. 修改用户ourteams的所属组为gname组,查看该用户的信息;usermod -g gname ourteams id ourteams 4. 查看当前在线的用户信息,即查看当前有哪些用户登录到系统中;who 5. 使用ourteams用户登录系统:(请按顺序写作业)su - ourteams 6. 进入ourteams用户的家目录,同时创建三个文件夹ateam,bteam和cteammkdir ateam bteam cteam 7. 拷贝ourteams用户的家目录下的.bashrc文件到ateam文件夹中,并修改文件名称为afilecp .bashrc ateam/afile 8. 拷贝ateam文件夹到cteam文件夹中,修改cteam文件夹下的ateam文件夹为cdircp -r ateam cteam/cdir 9. 修改bteam文件名为bdir,将ateam文件夹移动到bdir中mv bteam bdir mv ateam bdir 10. 拷贝/etc/man.config文件到ourteams用户家目录下;cp /etc/man.config ./ 11. 查看man.config文件的前5 行;head -5 man.config 12. 查看man.config文件的最后3 行;tail -3 man.config 13. 为man.config文件的所属用户加上可执行权限,其他用户取消可读权限;chmod u+x man.config 14. 切换到root用户,设置bdir及bdir下所有的文件权限为所属用户具有读写权限,所属组用户具有读和执行权限,其他用户只有读取权限;su - root chmod -R 654 bdir 15. 切换到root用户,将/home/ourteams/man.config所属用户修改为bin,所属组修改为root。chown bin:root man.config 16. 切换到ourteams用户,为/home/ourteams/cteam/cdir下的afile创建硬链接,链接到用户家目录,链接名称为yfile;su - ourteams ln /home/ourteams/cteam/cdir/afile yfile 17. 为/home/ourteams/cteam/cdir文件夹创建一个软连接,连接名称为rdir,链接到/home/ourteams目录下;ln -s /home/ourteams/cteam/cdir rdir 18. 在rdir中创建一个新的文件,rlj.txt;touch rlj.txt 19. 使用root用户登录系统20. 修改gname的组id为650 ;groupmod -g 650 gname 21. 将ourteams用户加入到root组中;gpasswd -a ourteams root 22. 查看ourteams用户属于哪些组;id ourteams 23. 修改outeams用户家目录所属组为gname组usermod -g gname ourteams 24. 修改ourteams用户家目录以及家目录下所有文件所属用户以及组都为rootchown -R root:root ourteams 25. 删除ourteams用户以及它的家目录文件userdel -r ourteams
002-作业 基础篇:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 1.写出系统1分钟后关机的命令。 shutdown -h 1 2.重启机器的命令 reboot 3.查看当前目录的命令。 pwd 4.开机启动级别的系统文件是 vi /etc/inittab 5.查看环境变量的系统文件是: vi /etc/profile 6.添加别名 l=ls –l ,并指定到环境变量中 vi /etc/profile G最后一行,输入alias l=“ls -l”:wq, source/etc/profile 添加登录提示语“welcome to hzn” 7.在root用户的家目录下创建目录file mkdir file 8.拷贝/etc/passwd文件至file目录 cp /etc/passwd file 9.给passwd文件重命名为password mv passwd password 10.查看password文件,并显示行号。 cat -n password 11.查看password文件的前5行的命令 head -5 password 12.查看password文件的后5行的命令 tail -5 password 13.在file 目录下创建多个目录 1 2 3 4 5 6 mkdir 1 2 3 4 5 6 14.在1目录下创建多层文件夹 ,1下面有文件夹a,a下面有文件夹b,b文件夹下面有 mkdir -p a/b/c 15.在c目录下创建文件Firsttest.txt touch Firsttest.txt 16.拷贝/etc/passwd的内容到新建的文件Firsttest.txt中 cat /etc/passwd>> Firsttest.txt - 对Firsttest.txt文件进行编辑: 跳转到该文件的结尾,输入内容: Hello,This is the first time to edit the file And I am glad to learn more End vi Firsttest.txt G i 输入: Hello,This is the first time to edit the file And I am glad to learn more End :wq - 复制该文本第3-6行的内容,并将其粘贴到该文件的末尾 :3,6y G p - 删除该文件的第15-18行内容 :15,18d - 查找文件中的home字符 /home - 查找含有e的行,查找不区分大小写 /e\c - 替换文本所有行的bin为BIN 1,$s/bin/BIN/g % s/bin/BIN/g 保存退出 :wq - 重新进入该文本编辑,设置显示行号 vi Firsttest.txt :set nu - 跳转到行号40行,将该行的home修改为HOME :40 s/home/HOME/g 不保存退出 :q! 17.拷贝1目录下所有的文件及目录至2文件夹下 cd /root/file/1 cp -r 1 2 18.删除1目录下所有文件及目录 rm -rf 1 19挂载linux.iso光盘至3文件夹 mount /dev/cdrom 3 练习: 在root用户家目录新建文件test 手动输入字母a到z, 100遍
003-作业 基础篇:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 1.恢复RHEL5的快照 2.新建组china和english groupadd china groupadd english 3.新建用户china1和用户china2,属于china组,将他们的密码设置为他们的用户名,如china1设置密码为china1 useradd -g china china2 passwd china1 passwd china2 4.新建用户eng1和用户eng2,属于english组,将他们的密码设置为他们的用户名 useradd -g english eng1 useradd -g english eng2 5.以eng1用户登录系统 su - eng1 6.创建多个文件夹file1,file2和file3 mkdir file1 file2 file3 7.拷贝/etc/passwd文件到eng1用户的家目录下,修改名称为groupeng cp /etc/passwd ~/groupeng 8.打开groupeng文件 vi groupeng 将该文件的root替换为自己的姓名首字母缩写 :%s/root/wxt/g 到第15行,删除15行之后的所有内容 :15 dG 复制第一行的内容,将它粘贴到最后一行去 gg yy G p 替换第3行到第8行的sh为545 :3,8s/sh/545/g 删除第一行 gg dd 撤销上一步操作 u 保存该文档 :wq 9.在文件夹file1下新增递归文件夹a/b/c/d/e/f mkdir -p file1/a/b/c/d/e/f 10.拷贝groupeng文件到f文件夹下 cp groupeng file1/a/b/c/d/e/f 11.拷贝file1/a/b/c/d文件夹及文件夹下所有的文件到file2目录下 cp -r file1/a/b/c/d file2 12.删除eng1家目录下的groupeng文件 rm groupeng 13.在file2文件夹下创建文件atest touch file2/atest 14.查看atest文件占用的磁盘空间,将查看的结果输出到file2文件夹的btest文件中 du -sh * du -sh attest >> btest 15.拷贝file1下a/b/c/d/e/f文件夹中的groupeng为group1 cp file1/a/b/c/d/e/f/groupeng file1/a/b/c/d/e/f/group1 16.找出系统中关于ssh的进程 ps -ef | grep ssh 17.查找出home下含有a的文件 find /home -name "*a*" 18.查找出home下名称为groupeng的文件 find /home -name "groupeng" 19.查找出第二个字母为h的文件 find /home -name "?h*" 20.查找系统中是否安装过zsh的rpm包,如果已安装则卸载该应用 rpm -q zsh 21.挂载rhel5的镜像文件,找出含有zsh的rpm包,安装zsh的rpm包 mount /dev/cdrom /mnt cd /mnt ls cd Server ls |grep zsh rpm -ivh zsh-4.2.6-3.el5.i386.rpm 22.安装vsftpd的rpm包。查看该服务的信息,如何查看该服务的配置文件; ls |grep ftp rpm -ivh vstpd rpm -qi vsftpd rpm -qc vsftpd 23.在用户家目录下创建setup文件夹,上传ftplinux第三天mysql相关文件至该目录 cd mkdir setup cd setup rz 24.将setup目录打包成tar包放置到家目录 tar -cvf setup.tar setup 将setup目录打包成tar.gz放到home目录,并命名为set.tgz tar -zcvf /home/set.tgz setup 解压set.tgz文件至根目录 tar -zxvf set.tgz -C / 25.删除根目录下setup目录及目录文件 rm -rf /setup 26.将setup目录打包成zip包放置到家目录 zip -r setup.zip setup 27.解压zip包到home目录 unzip setup.zip -d /home
001-shell shell是一个命令解释器:
1 2 3 4 5 shell的版本:常用bshell,cshell Bourne Shell BASH( Bshell) Korn Shell C Shell
查看本机shell:
1 2 3 4 5 6 echo $SHELL cat /etc/shells /bin/sh 已被/bin/bash替换 /bin/bash 默认的shell /sbin/nologin /bin/ash
执行脚本:
1 2 3 4 ./1.sh /root/shell1/1.sh bash 1.sh sh 1.sh
脚本格式:
1 2 3 4 vi 1.sh # !/bin/bash # 这是一个shell脚本 echo “hello world!”
输出echo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 echo命令显示文本行或变量取值。或者把字符输入到文件中 \t跳格 \n换行 echo -e 使转义符生效 [root@wxt shell1]# echo -e "hello\tboy" echo命令对特殊字符敏感: \:转义特殊字符,使其失效 双引号“ ”:保留引号内字符的特殊含义 单引号‘’:引号里面的内容作为字符输出 反引号:存放命令 echo The time is `date +%y%m%d` echo $SHELL echo $PATH echo what\'s the means the sign '"`v_v`"' a=b echo ${a}24 b24
输入read:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 -p 在等待read输入前提示信息 -t 秒数,指定等待时间 -n 字符数,指定接受的字符数就会执行 -s 隐藏输入数据,用于机密信息的输入 [root@wxt shell1]# read a 1 [root@wxt shell1]# echo $a 1 [root@wxt shell1]# read b 2 [root@wxt shell1]# echo $b 2 [root@wxt shell1]# read b adcc [root@wxt shell1]# echo $b adcc -p: [root@wxt shell1]# read -p "pleas write a number:" a pleas write a number:fdssd [root@wxt shell1]# echo $a fdssd [root@wxt shell1]# read name surname John Mike Kate [root@wxt shell1]# echo $surname Mike Kate [root@wxt shell1]# read user password mike 1234567 [root@wxt shell1]# echo $user mike [root@wxt shell1]# echo $password 1234567 [root@wxt shell1]# read user password mike [root@wxt shell1]# echo $user mike [root@wxt shell1]# read user password mike john 123456 [root@wxt shell1]# echo $user mike [root@wxt shell1]# echo $password john 123456 [root@wxt shell1]# read var1 var2 var3 1 2 3 4 5 [root@wxt shell1]# echo var1 var1 [root@wxt shell1]# echo $var1 1 [root@wxt shell1]# echo $var2 2 [root@wxt shell1]# echo $var3 3 4 5
要以>EOF结尾
1 2 3 4 5 6 7 8 9 10 11 12 [root@wxt shell1]# cat << EOF > AKJSDNI > ASDFAKSDM > SADKMFA > FDKLMVA > ASKMA > EOF > AKJSDNI > ASDFAKSDM > SADKMFA > FDKLMVA > ASKMA
输出tee: (常和|结合使用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 tee -a追加 [root@wxt shell1]# echo "hello" > 1 [root@wxt shell1]# cat 1 hello [root@wxt shell1]# echo "hello" >> 1 [root@wxt shell1]# echo "hello" >> 1 [root@wxt shell1]# echo "hello" >> 1 [root@wxt shell1]# cat 1 hello hello hello hello [root@wxt shell1]# echo "hello" > 1 [root@wxt shell1]# cat 1 hello [root@wxt shell1]# echo "hello world" |tee 1 hello world [root@wxt shell1]# cat 1 hello world [root@wxt shell1]# echo "hello world" |tee -a 1 hello world [root@wxt shell1]# echo "hello world1" |tee -a 1 hello world1 [root@wxt shell1]# cat 1 hello world hello world hello world1 [root@wxt shell1]# who |tee who.info root tty1 Oct 27 06:06 root :0 Oct 25 13:18 root pts/3 Oct 28 04:55 (192.168.184.1) root pts/4 Oct 27 07:48 (:0.0) [root@wxt shell1]# cat who.info root tty1 Oct 27 06:06 root :0 Oct 25 13:18 root pts/3 Oct 28 04:55 (192.168.184.1) root pts/4 Oct 27 07:48 (:0.0) [root@wxt shell1]# who |tee -a who.info root tty1 Oct 27 06:06 root :0 Oct 25 13:18 root pts/3 Oct 28 04:55 (192.168.184.1) root pts/4 Oct 27 07:48 (:0.0) [root@wxt shell1]# cat who.info root tty1 Oct 27 06:06 root :0 Oct 25 13:18 root pts/3 Oct 28 04:55 (192.168.184.1) root pts/4 Oct 27 07:48 (:0.0) root tty1 Oct 27 06:06 root :0 Oct 25 13:18 root pts/3 Oct 28 04:55 (192.168.184.1) root pts/4 Oct 27 07:48 (:0.0) [root@wxt shell1]# ps -ef|grep vi|tee pid_info [root@wxt shell1]# who |tee -a pid_info
标准输入,输出和错误 标准输入 0 标准输出 1 标准错误 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [root@wxt shell1]# vi 1.sh [root@wxt shell1]# sh 1.sh /root/shell1 1.sh: line 3: lsa: command not found [root@wxt shell1]# sh 1.sh 1>yes 1.sh: line 3: lsa: command not found [root@wxt shell1]# sh 1.sh 2>no /root/shell1 [root@wxt shell1]# cat yes /root/shell1 [root@wxt shell1]# cat no 1.sh: line 3: lsa: command not found [root@wxt shell1]# sh 1.sh 1>yes 2>no [root@wxt shell1]# sh 1.sh >file 2>&1 [root@wxt shell1]# cat file /root/shell1 1.sh: line 3: lsa: command not found [root@wxt shell1]# sh 1.sh >>file 2>&1 [root@wxt shell1]# cat file /root/shell1 1.sh: line 3: lsa: command not found /root/shell1 1.sh: line 3: lsa: command not found [root@wxt shell1]# cat <file /root/shell1 1.sh: line 3: lsa: command not found /root/shell1 1.sh: line 3: lsa: command not found [root@wxt shell1]# cat <file >file2 [root@wxt shell1]# cat file2 /root/shell1 1.sh: line 3: lsa: command not found /root/shell1 1.sh: line 3: lsa: command not found 标准错误输送到系统垃圾箱: [root@wxt shell1]# sh 1.sh >file 2>/dev/null [root@wxt shell1]# sh 1.sh > r.log 2>&1 ls -a>>r.log
sort排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -n -rn [root@wxt shell1]# vi test [root@wxt shell1]# cat test 1 as 3 km 2 ds 4 sa [root@wxt shell1]# sort -n test 1 as 2 ds 3 km 4 sa [root@wxt shell1]# sort -rn test 4 sa 3 km 2 ds 1 as
shell后台执行:crontab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 -e 编辑crontab任务 -l 列出crontab任务中的内容 -r 删除当前用户的crontab crontab -e * * * * * date >>/root/shell1/date.log tail -f date,log [root@wxt shell1]# crontab -l * * * * * date >>/root/shell1/date.log * * * * * 分,时,日,月,星期 星期为0-6,0为星期日 1 2 9,18,22 * * service vsftpd restart 0 3 9-18 * * echo "JUST do IT" >>~/it.log */5 * * * * /bin/ls 0 18-23/2 * * * sh back.sh 12 2 * * * sh a.sh 2>>~/r.log 1>>~/e.log 删除: [root@wxt shell1]# crontab -r 用户之间不能互相查看crontab -e,root用户也不能 root可以用命令:crontab -l -u hzn sleep 10休眠10s
002-shell at:SHELL后台执行 at -f at -d at -l
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [root@wxt ~]# date Fri Oct 28 15:31:55 CST 2016 [root@wxt ~]# at 11:26 (ctrl+d结束at编辑) at> date >>~/date.log at> <EOT> job 1 at 2016-10-29 11:26 [root@wxt ~]# at -l 1 2016-10-29 11:26 a root at 时间 -f 脚本 [root@wxt ~]# at 15:00 tomorrow -f ~/1.sh [root@wxt shell1]# date Fri Oct 28 15:39:32 CST 2016 [root@wxt shell1]# at 15:40 today -f date.sh job 4 at 2016-10-28 15:40 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 2 2016-10-29 15:32 a root at -d 编号 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 2 2016-10-29 15:32 a root [root@wxt shell1]# at -d 2 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 课上练习: vi 1.sh # !/bin/bash finde=`find /home/test/source -name "ROM*"` cp $finde /home/test/bak >cp_file.log 2>cp_error.log :wq at 13:00 -f 1.sh
&:(后台执行,不占据终端)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 jobs -l 查看后台进程 [root@wxt setup]# tar -cf oa.tar oa & [1] 6628 [root@wxt setup]# jobs -l [1]+ 6628 Running tar -cf oa.tar oa & ctrl+z将vi放到后台; fg回到vi rom.sh [root@wxt shell1]# vi rom.sh ctrl+z [1]+ Stopped vi rom.sh [root@wxt shell1]# jobs -l [1]+ 6648 停止 vi rom.sh [root@wxt shell1]# fg
系统变量(环境变量):/etc/profile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 (必须先export,再env) env 查看所有系统环境变量 export 变量 env|grep 变量 unset 变量 [root@wxt shell1]# dname=2 [root@wxt shell1]# env |grep dname [root@wxt shell1]# export dname [root@wxt shell1]# env |grep dname dname=2 unset:清除系统环境变量 [root@wxt shell1]# unset dname [root@wxt shell1]# echo $dname2 [root@wxt shell1]# env|grep dname 用户变量(.bash_profile在用户家目录下): set 显示用户所有变量 ① [root@wxt shell1]# name3=2 [root@wxt shell1]# set |grep name3 name3=2 [root@wxt shell1]# unset name3 [root@wxt shell1]# set |grep name3 _=name3 ② (abc已经有值,所以不可以再赋值给abc,结果还应该是1,为空则赋值给他) [root@wxt shell1]# abc=1 [root@wxt shell1]# echo ${abc:=4} 1 [root@wxt shell1]# echo ${abcd:=4} 4 [root@wxt shell1]# echo $abcd 4 ③ [root@wxt shell1]# dir=/home [root@wxt shell1]# cd $dir [root@wxt home]# pwd /home [root@wxt home]# ls 123.tar china2 eng2 home ourteams set.tgz test1 user.log wang2 wxt china1 eng1 file1 oracle passwd setup test2 wang1 wang3 yzy [root@wxt home]# cd /$dir/eng2 ④ [root@wxt eng2]# wen=`date` [root@wxt eng2]# echo $wen Fri Oct 28 16:44:35 CST 2016 ⑤ [root@wxt eng2]# file=`find /root -name "a*"` [root@wxt eng2]# echo $file ⑥ [root@wxt ~]# file=`ls` [root@wxt ~]# echo $file 1 11.tar 123.tar Desktop a a1 a2 anaconda-ks.cfg b b1 b2 bash_profile c 设置只读(只能注销或退出才能取消只读,只读的时候不可以unset删除用户变量) [root@wxt ~]# name=zcw [root@wxt ~]# readonly name [root@wxt ~]# name=zcw1(不可写) -bash: name: readonly variable [root@wxt ~]# unset name(不可删除) -bash: unset: name: cannot unset: readonly variable
位置变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 属于只读变量 参数个数任意多,但只有前9个被访问到 第一个参数为0,表示预留保存实际脚本名字,无论脚本是否有参数,此值均可用 ① vi 0.sh # !/bin/bash echo $0 echo $1 echo $2 ②第一个参数为0,表示预留保存实际脚本名字,无论脚本是否有参数,此值均可用 [root@wxt shell1]# vi test.sh [root@wxt shell1]# sh test.sh test.sh [root@wxt shell1]# sh test.sh a b c d test.sh a b [root@wxt shell1]# chmod 777 test.sh [root@wxt shell1]# ./test.sh a b c d ./test.sh a b ③参数个数任意多,但只有前9个被访问到 [root@wxt shell1]# vi test.sh [root@wxt shell1]# sh test.sh a b c d e f g h i j k test.sh a b c d e f g h i a0
向系统命令传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 ① # !/bin/bash find /root/shell24 -name $1(在这个目录下查找) [root@wxt shell24]# sh 20.sh passwd ②(其中1.sh,2.sh,passwd为文件) # !/bin/bash cat -n $1 $2 $4 >catfile.log 2>catfile.err [root@wxtshell1]# sh catfile.sh 1.sh 2.sh passwd [root@wxt shell1] [root@wxt shell1]# cat catfile.err ③查看脚本如何执行的步骤 sh -x 1.sh sh -x 1.sh 2.sh 特殊变量 $ $ *脚本的所有(整体)横行 $ $脚本运行的当前id号 $ ?显示最后命令执行的状态,0表示正确执行,其他任何值表示错误 $ ! 后台运行的最后一个进程id号 $ @与$*相同,加引号,在引号中返回每个参数(把参数作为个体)竖行 --------------------------------------------------- ① vi 0.sh # !/bin/bash echo $# echo $* echo $$ echo $? [root@wxt shell1]# sh 0.sh a fd sdf sadf sdfasdf asdf 6 a fd sdf sadf sdfasdf asdf 8652 0 ② [root@wxt shell1]# echo $? 0 [root@wxt shell1]# lsa -bash: lsa: command not found [root@wxt shell1]# echo $? 127 [root@wxt shell1]# mkdir dir [root@wxt shell1]# test -e dir [root@wxt shell1]# echo $? 0 [root@wxt shell1]# test -e mkakia [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -e mkakia;echo $? 1 [root@wxt shell1]# test -f dir [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -f no [root@wxt shell1]# echo $? 0 [root@wxt shell1]# test -d no [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -d dir [root@wxt shell1]# echo $? 0
003-shell expr:字符串测试和数值测试
1 2 3 4 5 6 7 8 9 一般用于整数值 expr 5 + 3 expr 5 - 3 expr 5 \* 3 expr 5 / 2(结果为2,不输出小数) a=1 b=1 echo $a + $b =echo $[a+b] =echo $((a+b)) echo $(echo $a + $b)= echo $ `echo $a + $b`
查看系统版本
1 2 3 uname -l lsb_release cat /proce/issue
if条件语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi ① # !/bin/bash read -p "please write a number:" a if [ $a -gt 3 ] then echo "大了" else echo "小了" fi ② vi 2.sh # !/bin/bash read -p "please write:" a if [ -z $a ] then echo $aecho $aecho "You did not enter any info." else echo $a fi ③ # !/bin/bash read -p "please write a user name:" name file=`grep $name passwd` if [ -n file ] then echo "String $name is exist" else echo "String $name is not exit" fi 或者 # !/bin/bash read -p "please write a user name:" name if [ -n “`grep $name passwd`”] then echo "String $name is exist" else echo "String $name is not exit" fi ④ # !/bin/bash read -p "please write a number:" a if [ $a -gt 3 ] then echo "大了" elif [ $a -eq 3 ] then echo "等于3" else echo "小了" fi ⑤ # !/bin/bash read -p "please write name:" name if [ -d $name ] then echo "$name is a dir" elif [ -f $name ] then echo "$name is file" else echo "$name is an unknow" fi
case条件选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 case 值(如a;) in 命令1 ;; 命令2 ;; 3|4) 命令3 (|表示或者的意思) *) 命令4 ;; esac ① # !/bin/bash read -p "please write:" a case $a in 1) echo "a" ;; 2) echo "b" ;; 3) echo "c" ;; 4|5) echo "cd" ;; *) echo "unknow" ;; esac ② # !/bin/bash read -p "please write a name:" name case $name in 1) echo $[1+2] ;; 2) pwd ;; 3|4) cat /proce/issue ;; *) echo "Please enter number [1|2|3|4]" ;; esac
for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 for 变量名(如:i,loop) in 列表 do 命令1 命令2 done ① # !/bin/bash for i in 1 2 3 4 do echo $i done ② # !/bin/bash read -p "please write namae:" a b c d e for loop in $a $b $c $d $e do touch $loop done ③ # !/bin/bash for loop do touch $loop done [root@wxt shell24]# sh 9.sh a b c d e (for后面不加in,执行脚本时,输入参数) ④ # !/bin/bash for loop in `seq 10` do echo "$loop * $loop= $[loop * loop]" done ⑤(seq 9输出1-9;seq 2 10;输出2-10)(echo -n 不换行) # !/bin/bash] for i in `seq 9` do for j in `seq 9` do [ $j -le $i ] && echo -n "$i * $j =$[i*j] " done echo " " done [root@wxt shell24]# sh 11.sh 1 * 1 =1 2 * 1 =2 2 * 2 =4 3 * 1 =3 3 * 2 =6 3 * 3 =9 4 * 1 =4 4 * 2 =8 4 * 3 =12 4 * 4 =16 5 * 1 =5 5 * 2 =10 5 * 3 =15 5 * 4 =20 5 * 5 =25 6 * 1 =6 6 * 2 =12 6 * 3 =18 6 * 4 =24 6 * 5 =30 6 * 6 =36 7 * 1 =7 7 * 2 =14 7 * 3 =21 7 * 4 =28 7 * 5 =35 7 * 6 =42 7 * 7 =49 8 * 1 =8 8 * 2 =16 8 * 3 =24 8 * 4 =32 8 * 5 =40 8 * 6 =48 8 * 7 =56 8 * 8 =64 9 * 1 =9 9 * 2 =18 9 * 3 =27 9 * 4 =36 9 * 5 =45 9 * 6 =54 9 * 7 =63 9 * 8 =72 9 * 9 =81 ⑥(输出循环次数) # !/bin/bash n=0 for i in `ls` do echo $i n=$[n+1} done echo $n
004-shell 课前回答问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ①判断是否为三角形(不考虑是不是三角形) # !/bin/bash read -p "please write three number:" a b c if [ $a -eq $b -o $a -eq $c -o $b -eq $c ] then echo "等腰三角形" elif [ $a -eq $b -a $a -eq $c ] then echo "等边三角形" else echo "普通三角形" fi ② # !/bin/bash read -p "please write 3 number: " a b c case $a in 1) expr 1 + 1 ;; 2) ps -ef|grep ftp ;; 3) find / -name "*root* >a.log ;; *) echo "please re_enter it" ;; esac
while 条件循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 while 条件 do 命令 done 课上习题:求10以内的自然数的平方值 # !/bin/bash n=1 while [ $n -le 10 ] do echo "$n * $n" =$[n*n] n=$[n+1] done 求n1到n2以内的自然数的平方值 # !/bin/bash read -p "输入两个数字:" n1 n2 if [ $n2 -gt $n1 ] then while [ $n1 -le $n2 ] do echo "$n1 * $n1=$[n1*n1]" n1=$[n1+1] done else echo "重新输入" fi for循环做不到,while做得到的循环 [root@wxt shell29]# cat a.text afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj # !/bin/bash for i in `cat a.tex` do echo $i sleep 1 done [root@wxt shell29]# sh 00.sh afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj cat a.text|while read line do echo $line sleep 1 done [root@wxt shell29]# sh 111.sh afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj ②(passwd里有/bin/bash的是可登陆用户) # !/bin/bash cat passwd|while read line do echo "$line" n=`echo "$line" | grep /bin/bash` if [ -z "$n" ] then echo "NO " else echo "YES" fi sleep 1 done
until:
1 2 3 4 5 6 7 8 9 10 11 12 until 条件 do 命令 done # !/bin/bash i=1 until [ $i -eq 11 ] do echo "$i * $i =$[i*i]" i=$[i+1] done
continue和break:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 continue和break用在while,for,if语句中 break 跳出循环; continu 回到循环开始的地方break2跳出整个循环 continue: # !/bin/bash for i in 1 2 3 4 5 6 do [ $i -eq 3 ] && continue echo $i done [root@wxt shell29]# sh 8.sh 1 2 4 5 6 break: # !/bin/bash for i in 1 2 3 4 5 6 do [ $i -eq 3 ] && break echo $i done [root@wxt shell29]# sh 9.sh 1 2 a++;b--(a=a+1;b=b-1) # !/bin/bash for ((i=2;i<=100;i=i*2)) do echo "$i" done
函数:
1 2 3 4 5 6 7 8 # !/bin/bash fun( ) { echo $1 echo $2 echo $3 echo $4 } fun a b c d
补充:
cd $HOME 等于 cd 等于 cd ~ 【到家目录】
005-shell 正则表达式
1 2 3 1.正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。 2.用某种模式去匹配一类字符串。 3.如:以字母a开头,该表达法可以让你写一个表达式,选定或匹配多个数据字符串。
基本正则表达式:
符号
意义
*
匹配前一个字符0到任意多个字符
.
匹配任意单个字符
^
匹配行首
$
匹配行尾
[]
匹配行尾
\
转义符,屏蔽一个特殊符号的特殊意义
\<\>|
精确匹配
\{n\}
匹配前面的字符出现n次
\{n,m\}
匹配前面的字符出现n~m次
cut
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 命令:cut按列进行截取 语法:cut[option]文件名 参数: -c:参数后面跟数字,表示指定第几个字符 -f:参数后面跟数字,表示指定第几个区(由分隔符分隔的区块) -d:后面跟分隔用的字符,如果不加该参数,默认为tab,一般与-f一起使用 Example: 1.截取系统中的组名 cut-d ":" -f 1 /etc/group 2.获取文件每行的第一个字符 cut -c 1 /etc/group 3.获取文件每行的第1到5个字符 cut -c 1-5 /etc/group 4.获取文件每行的第1和第5个字符 cut -c 1,5 /etc/group
grep
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 命令:grep 语法:grep [option] pattern [file] 参数: -c:计算找到‘搜寻字符串’的行数 -i:忽略大写的不同,所以大小写视为相同 -n:顺便输出行号 -v:反向选择 2.word$:待搜寻的字符串(word)在行尾 搜寻"bash"结尾的行: 例: grep bash$ passwd 6.搜寻不以#开头的行 ^[^#] 注:^符号,在字符集合符合(括号[])之内与之外是不同的!在[]内代表方向选择,在[]之外则代表定位在行首的意义! 7.","匹配任意单个字符 查找出a和c之间一定有一个字符的行 8.[n1-n2]:字符集合的,里面列出想要包括的字符范围 搜寻含有数字的3和4的行:grep "[3-4]" file.txt 搜寻含有数字的行:grep "[0-9]" file.txt 搜寻含有小写字母的行:grep "[a-z]" file.txt 搜寻含有大写字母的行:grep "[A-Z]" file.txt 搜寻含有字母的行:grep "[a-zA-Z]" file.txt 9.\{n.m\}匹配表达式前至少n次,至多m次 搜寻r和r之间有2到3个o的行:grep 'ro\{2,3\}r' file.txt Example: grep -c root passwd 2 grep root passwd|wc -l 2 grep -r root shell5 shell5/passwd:root:x:0:0:root:/root:/bin/bash shell5/passwd:operator:x:11:0:operator:/root/sbin/nologin grep ro.*t passwd grep ^b passwd grep t$ passwd grep in$ passwd grep ^.o passwd grep o..$ passwd grep ^[rbs] passwd grep ^[^a-z] passwd grep "r\*" passwd grep "2\*" passwd grep "ro\{3\}t" test grep "ro\{2\}t" test grep "ro\{2\}" test grep "ro\{3\}" test grep "ro\{3,\}t" test grep "ro\{3,4\}t" test grep "\<bin\>" test Exercise:grep,cut 1.查找passwd文件中含有nologin的行,且输出行号 2.查找passwd文件中没有/bin/bash的行 3.输出每个用户的用户名及用户的shell类型 4.输出passwd文件的中每行的前10个字符 5.输出含有root的行,不区分大小写 6.将PATH变量取出,找出第三个路径 7.输出登录系统的用户名 Exercise:grep 寻找包括g 开头和t 结束的字符串, 中间 可有可无 grep ^g.*t$ test 寻找包括有r 开头和t 结束且长度为四个字符行 grep ^r..t$ test 显示 空白行及行 号 grep -n ^$ tes 寻找开头不是英文 字母 grep -v ^[a-zA-Z] test 找出开始为小写字母 的 grep ^[a-z] tests 寻找oo, ooo 等等的数据, 也就是说, 至少要有两个o 以上 grep "o\{2,\}" test 找出g 后有两个以上的a ,以n 结尾的 行 grep "ga\{2,\}.*n$" test 找出含有hz 或hj 的 行 grep h[zj] test env ,取得第 12 字符以后的所有字符串且去掉 空行 env | cut -c 12- | grep -v ^$
sed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件:简化对文件的反复造作; 语法: sed [选项] '命令' [文件名] 选项: -n 只输出经过sed命令处理的行 -i 编辑文件内容,修改源文件,而不是屏幕输出 a 追加 i 插入 p 打印,通常p会与参数sed -n一起运作 d 删除*** s 字符串替换!通常这个s的动作可以搭配正则表示法!例如1,20s/old/new/g c 行替换 Example: 1.不打印第一行 sed '1d' passwd 2.不打印最后一行 sed '$d' passwd 3.不打印第一行到第二行 sed '1,2d' passwd 4.替换第2行到第5行的数据为team sed '2,5cteam' passwd 5.在文件头插入"###" sed '1i###' passwd >a.txt 6.显示文件第三行 sed -n '3p' passwd 7.显示文件第一行和第三行 sed -n '1p;3p' passwd 8.显示文件除前三行之外的全部内容 sed -n '1,3!p' passwd sed命令可以使用正则表达式的字符进行匹配,如sed结合$匹配最后一行 例:打印最后一行 sed -n '$p' file sed可以使用/字符串/进行任意字符的匹配 例:打印开头字符是a的行 sed -n '/^.a/p' file Example: sed -n '/root/p' /etc/passwd|sed 's/root/bird/g' sed -n '/root/p' /etc/passwd|sed 's/root//g' sed -n '/root/p' /etc/passwd|sed 's/^root/bird/g' sed 's/[0-9]/team/g' mail.log sed 's/^a.*/team/g' mail.log Exercise:sed 1.在文件尾插入“@@@” sed '$a@@@' passwd 2.把文件第三行替换成“$$$” sed '3c$$$' passwd 3.列出行号并打印,同时删除2-5行 cat -n a.sh|sed '2,5d' 4.删除最后一行 cat -n a.sh|sed '$d' 5.删除空行并打印出行号 sed 's/^$/d' a.sh|cat -n 6.替换/etc/inittab文件中 “id:5:initdefault:”一行中的数字为3 cat /etc/inittab|grep id|sed 's/5/3/g' 7.替换passwd中root所在的行,替换为iusttest sed 's/.*root.*/justtest/g' a.txt (sed '/root/ciusttest') 8.打印出passwd中的第3行和第8行 sed -n '3p;8p' a.sh 9.给文件每一行的最后面添加字符串root23 sed 's/^.*$/&root123' a.sh 使用脚本实现下列功能: 1.设定变量file的值为/etc/passwd 2.使用循环读取文件/etc/passwd的第2,4,6,8,10,13行,并显示其内容 3.把这些行保存到/tmp/mvpasswd文件中 # !/bin/bash file=/etc/passwd for i in 2 4 6 8 10 13 do sed -n ${i}p $file sleep 1 done
awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 1.awk是一种优良的文本处理工具,linux及unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。 2.最简单地说,awk是一种用于处理文本的编程语言工具 3.任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间 awk '{print $1 " and " $2}' test a and b f and g q and e awk '条件类型1 {动作1}条件类型2 {动作2}...' 文件名称 分隔符默认是空格 可以用-F,改变变成逗号为分隔符或改成冒号-F: 变量: NR 目前awk所处理的行数 FS 目前的分隔符 NF 每行所拥有的总数 awk '{print $1 "\tlines" FS":"NR"\nSum:"NF}' awk.txt who|awk '{print $3 "\t" NR}' 2016-11-17 1 2016-11-17 2 2016-11-29 3 2016-11-27 4 awk -F : '{print $1}' passwd 显示所有内容: awk '{print $0}' result.txt 显示第一列,以:作为分隔符 awk -F: '{print $1}' /etc/passwd 显示第一列和第三列的内容 awk '{print $1,$3}' result.txt 显示第一列含有bob的行 awk '$1~/bob/ {print $0}' result.txt awk -F : '/root/{print $1 }' passwd root aperator 自定义年月日显示方式: Year:2016 month:Feb days:11 例: date|awk '{print "Year:"$6 "\tmonth:$2"\tdays:"$3}' Years:2015 month:Feb days:11 打印一个文件头,打印一个文件尾 特殊字段: BEGIN语句设置计算和打印头部信息,在任何动作之前进行。 END语句输出统计结构,在完成动作之后执行。 awk 'BEGIN{print "name level result\n"} {print $1,$2,$3} END {print "end of class results"}' result.txt tail -4 /etc/passwd|awk -F : 'BEGIN{print "username userbash"} {print $1,$7} END{print "The END"}' 第二列大于等于5的那些记录 awk '$2>=5 {print $0}' result.txt 显示用户名为andy或(和)第二列为9的记录 awk '{if($1 == "andy" && $2=="9"print $0)}' result.txt awk '{if($1 == "andy" || $2=="9"print $0)}' result.txt Esercise:awk 以/etc/passwd文件示例: 输出系统的所有用户名和用户的shell类型 awk 'BEGIN{FS=":"}{print $1,$2}' /etc/passwd 输出以root开头的行 awk -F : '/^root/{print $0}' /etc/passwd 输出bash类型不是/sbin/nologin的用户 grep -v /sbin/nogin /etc/passwd|awk -F: '{print $1}' 输出下列字符串中的1和2 sub_source_name=imp_data_1.txt imp_data_2.txt awk -F _ '{print $5 "." $7}' test.log |awk -F . '{print $1 "\t" $3}' 输出系统的ip地址信息 如:192.168.68.78 ifconfig|sed -n '2p'|awk '{print $2}'|awk -F : '{print $2}' 192.168.163.100 输出以root开头和包含squid的行 awk -F : '$1~/root/ {print $0} /squid/ {print $0}' /etc/passwd awk -F : '$1/root/ {print $0}' /etc/passwd head -5 /etc/passwd|awk -F ":" '{if($7 != "/sbin/nologin") print $1}' grep sub_source a.txt|awk -F "_" '{print $5,$7}'|awk -F "" '{print $1,"",$11}'|sed 's/[[:blank]]//g'
补充 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 dos2unix shell.txt 查看系统版本 uname -l lsb_release cat /proce/issue 查看连接某服务端口最多的的IP地址 netstat -ant | grep "192.168.4.245:22" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -20 每秒执行一次命令 # !/bin/bash while true do sleep 1 echo "do" done 文件名大小写转换 OLDFILE=OLD.FILE NEWFILE=`echo $OLDFILE | tr 'A-Z' 'a-z'` 自行建立一支程式,该程式可以用来计算『您还有几天可以过生日』 # !/bin/bash read -p "Pleas input your birthday (MMDD, ex> 0709): " bir now=`date +%m%d` if [ "$bir" == "$now" ]; then echo "Happy Birthday to you!!!" elif [ "$bir" -gt "$now" ]; then year=`date +%Y` total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24)) echo "Your birthday will be $total_d later" else year=$((`date +%Y`+1)) total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24)) echo "Your birthday will be $total_d later" fi 五颜六色的脚本 Linux终端也是支持五颜六色的,请看下面的脚本: # !/bin/bash clear echo -e "\033[1m Hello World" **bold effect** echo -e "\033[5m Blink" # blink effect echo -e "\033[0m Hello World" **back to noraml** echo -e "\033[31m Hello World" **Red color** echo -e "\033[32m Hello World" **Green color** echo -e "\033[33m Hello World" **See remaing on screen** echo -e "\033[34m Hello World" echo -e "\033[35m Hello World" echo -e "\033[36m Hello World" echo -e -n "\033[0m" **back to noraml** echo -e "\033[41m Hello World" echo -e "\033[42m Hello World" echo -e "\033[43m Hello World" echo -e "\033[44m Hello World" echo -e "\033[45m Hello World" echo -e "\033[46m Hello World" echo -e "\033[0m Hello World" 例子四:查看服务器利用率 查看服务器的利用率是管理员的一份重要的日常工作。聪明的管理员是知道如何是这份任务自动化的。下面的这份脚本会抓取服务器的很多信息,快快试试吧! # !/bin/bash date; echo "uptime:" uptime echo "Currently connected:" echo "--------------------" echo "Last logins:" last -a |head -3 echo "--------------------" echo "Disk and memory usage:" df -h | xargs | awk '{print "Free/total disk: " $11 " / " $9}' free -m | xargs | awk '{print "Free/total memory: " $17 " / " $8 " MB"}' echo "--------------------" start_log=`head -1 /var/log/messages |cut -c 1-12` oom=`grep -ci kill /var/log/messages` echo -n "OOM errors since $start_log :" $oom echo "" echo "--------------------" echo "Utilization and most expensive processes:" top -b |head -3 echo top -b |head -10 |tail -4 echo "--------------------" echo "Open TCP ports:" nmap -p- -T4 127.0.0.1 echo "--------------------" echo "Current connections:" ss -s echo "--------------------" echo "processes:" ps auxf --width=200 echo "--------------------" echo "vmstat:" vmstat 1 5
备份数据库
1 2 3 4 5 6 7 8 9 # !/bin/bash user=root pass=111111 database=`mysql -u $user -p$pass -e 'show databases;'|sed 1,2d` for i in $database do mysqldump -u $user -p$pass -B $i > ${i}`date +%Y-%m-%d`.sql done
抓包 Tcpdump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等 实践中,通常在 Linux 里用tcpdump命令抓包,然后在Windows 里用wireshark软件分析包。 tcpdump tcp -i eth0 -t -s 0 -c 100 and dst port 22 and src net 192.168 .1 .0 /24 -w ./target.cap (1 )tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2 )-i eth0 : 只抓经过接口eth0的包 (3 )-t : 不显示时间戳 (4 )-s 0 : 抓取数据包时默认抓取长度为68 字节。加上-S 0 后可以抓到完整的数据包 (5 )-c 100 : 只抓取100 个数据包 (6 )dst port ! 22 : 不抓取目标端口是22 的数据包 (7 )src net 192.168 .1 .0 /24 : 数据包的源网络地址为192.168 .1 .0 /24 (8 )-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析 : 抓取数据包时默认抓取长度为68 字节。加上-S 0 后可以抓到完整的数据包 较通用的tcpdump命令:tcpdump -i eth0 –s 0 –c 10 – w package.cap 注[对eth0进行完整数据包抓取,数据包输入保存到当前目录package.cap中,因为没有-c参数限制,须按Ctrl+C停止抓包]
实用命令实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 默认启动 tcpdump 普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 监视指定网络接口的数据包 tcpdump -i eth0 如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。 监视指定主机的数据包 也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包 tcpdump host 210.27.48.1 截取本机(192.168.31.147)和主机114.114.114.114之间的数据 tcpdump -n -i eth0 host 192.168.31.147 and 114.114.114.114 主机hostname接收的所有数据 tcpdump -i eth0 src host ip 接收目标IP的数据 监视所有送到主机hostname的数据包 tcpdump -i eth0 dst host ip 发送到目标IP的数据
作业1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 基础篇: 新建脚本,脚本名称为myfile.sh,脚本中包含下列内容: 使用/bin/sh 执行脚本内容 给脚本添加备注,备注内容为:This is my homework. 使用echo输出字符 Start 使用echo输出该脚本所在的路径 输出执行当前脚本的用户名 vi myfile.sh # !/bin/sh # This is my homework. echo Start echo `pwd` echo `who am i` :wq sh myfile.sh 使用echo输出如下格式内容(注意对齐格式) username passwd Xiao Ming xm@123$$ [root@wxt shell1]# echo -e "username\tpasswd\nXiao Ming\txm@123\$$" username passwd Xiao Ming xm@12325868 使用脚本实现如下功能,脚本名称为readme.sh: 读取3个变量vara,varb和varc 给变量输入4个值 home,temp,var,usr 输出三个变量的值 使用变量实现:进入home目录,并且列出home目录下的所有文件 [root@wxt shell1]# vi readme.sh # !/bin/bash echo home temp var usr >abc read vara varb varc <abc echo $vara echo $varb echo $varc cd /home ls [root@wxt shell1]# sh readme.sh # !/bin/bash read vara varb varc echo $vara echo $varb echo $varc cd /$vara ls 使用tee命令,将当前用户的信息存放到home下的user.log文件中。 [root@wxt shell1]# who am i|tee /home/user.log 使用文件重定向功能,实现下列内容: 将home目录的详细信息保存到用户家目录的home.info文件中 [root@wxt shell1]# ll /home >~/home.info 查找home目录下文件名以te开头的文件,将查询的结果信息放入用户家目录下的find.log文件中 [root@wxt shell1]# find /home -name "te*" >~/find.log 使用定时任务实现: 在11月份内,每天的8点到14点,每隔两小时执行/home/shell/backup.sh脚本,将备份的结果输出到文件bak20160312.log文件中。(其中20160312表示执行定时任务的日期,要将该日期替换为当前日期) crontab -e 0 8-14/2 11 * * sh /home/shell/back.sh > bak`date +%y%m%d`.log 使用echo输出字符串 Usage: $0 {start|stop|restart|condrestart|status} [root@wxt shell1]# echo 'Usage: $0 {start|stop|restart|condrestart|status}' 编写脚本vars.sh 指定用户的shell类型为bin/sh 输出内容:***** Practice start ***** 定义变量username为hznteam 进入当前用户家目录,使用上述变量,创建文件夹,文件夹名称为hznteamN(备注:N表示你所学习的期数,如:我在10期,文件名为hznteam10) 进入文件夹hznteamN 在该文件夹中,创建3个文件,文件名称由用户输入(暂不考虑不输入或输入过多的情况) 在第一个文件中写入 This is first file. 输出内容:***** Practice end ***** vi vars.sh # !/bin/sh echo *****Practice start***** username=hznteam echo $username mkdir ~/`echo $username`N mkdir ~/`echo ${name}24` # N表示你所学习的期数,如:我在10期,文件名为hznteam10 cd ~/hznteamN read -p "输入第一个文件名:" a read -p "输入第二个文件名:" b read -p "输入第三个文件名:" c touch `echo $a` `echo $b` `echo $c` echo This is first file > `echo $a` echo *****Practice end*****
作业2 at:SHELL后台执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 at -f at -d at -l [root@wxt ~]# date Fri Oct 28 15:31:55 CST 2016 [root@wxt ~]# at 11:26 (ctrl+d结束at编辑) at> date >>~/date.log at> <EOT> job 1 at 2016-10-29 11:26 [root@wxt ~]# at -l 1 2016-10-29 11:26 a root at 时间 -f 脚本 [root@wxt ~]# at 15:00 tomorrow -f ~/1.sh ③ [root@wxt shell1]# date Fri Oct 28 15:39:32 CST 2016 [root@wxt shell1]# at 15:40 today -f date.sh job 4 at 2016-10-28 15:40 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 2 2016-10-29 15:32 a root at -d 编号 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 2 2016-10-29 15:32 a root [root@wxt shell1]# at -d 2 [root@wxt shell1]# at -l 1 2016-10-29 11:26 a root 课上练习: vi 1.sh # !/bin/bash finde=`find /home/test/source -name "ROM*"` cp $finde /home/test/bak >cp_file.log 2>cp_error.log :wq at 13:00 -f 1.sh 技巧:a=`ls |grep -v 1.sh` rm -rf $a
jobs
1 2 3 4 5 6 7 8 9 10 11 12 13 &:(后台执行,不占据终端) jobs -l 查看后台进程 [root@wxt setup]# tar -cf oa.tar oa & [1] 6628 [root@wxt setup]# jobs -l [1]+ 6628 Running tar -cf oa.tar oa & ctrl+z将vi放到后台; fg回到vi rom.sh [root@wxt shell1]# vi rom.sh ctrl+z [1]+ Stopped vi rom.sh [root@wxt shell1]# jobs -l [1]+ 6648 停止 vi rom.sh [root@wxt shell1]# fg
系统变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 系统变量(环境变量):/etc/profile (必须先export,再env) env 查看所有系统环境变量 export 变量 env|grep 变量 unset 变量 [root@wxt shell1]# dname=2 [root@wxt shell1]# env |grep dname [root@wxt shell1]# export dname [root@wxt shell1]# env |grep dname dname=2 unset:清除系统环境变量 [root@wxt shell1]# unset dname [root@wxt shell1]# echo $dname2 [root@wxt shell1]# env|grep dname 用户变量(.bash_profile在用户家目录下): set 显示用户所有变量 ① [root@wxt shell1]# name3=2 [root@wxt shell1]# set |grep name3 name3=2 [root@wxt shell1]# unset name3 [root@wxt shell1]# set |grep name3 _=name3 ② (abc已经有值,所以不可以再赋值给abc,结果还应该是1,为空则赋值给他) [root@wxt shell1]# abc=1 [root@wxt shell1]# echo ${abc:=4} 1 [root@wxt shell1]# echo ${abcd:=4} 4 [root@wxt shell1]# echo $abcd 4 ③ [root@wxt shell1]# dir=/home [root@wxt shell1]# cd $dir [root@wxt home]# pwd /home [root@wxt home]# ls 123.tar china2 eng2 home ourteams set.tgz test1 user.log wang2 wxt china1 eng1 file1 oracle passwd setup test2 wang1 wang3 yzy [root@wxt home]# cd /$dir/eng2 ④ [root@wxt eng2]# wen=`date` [root@wxt eng2]# echo $wen Fri Oct 28 16:44:35 CST 2016 ⑤ [root@wxt eng2]# file=`find /root -name "a*"` [root@wxt eng2]# echo $file ⑥ [root@wxt ~]# file=`ls` [root@wxt ~]# echo $file 1 11.tar 123.tar Desktop a a1 a2 anaconda-ks.cfg b b1 b2 bash_profile c 设置只读(只能注销或退出才能取消只读,只读的时候不可以unset删除用户变量) [root@wxt ~]# name=zcw [root@wxt ~]# readonly name [root@wxt ~]# name=zcw1(不可写) -bash: name: readonly variable [root@wxt ~]# unset name(不可删除) -bash: unset: name: cannot unset: readonly variable
位置变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 属于只读变量 参数个数任意多,但只有前9个被访问到 第一个参数为0,表示预留保存实际脚本名字,无论脚本是否有参数,此值均可用 ① vi 0.sh # !/bin/bash echo $0 echo $1 echo $2 ②第一个参数为0,表示预留保存实际脚本名字,无论脚本是否有参数,此值均可用 [root@wxt shell1]# vi test.sh [root@wxt shell1]# sh test.sh test.sh [root@wxt shell1]# sh test.sh a b c d test.sh a b [root@wxt shell1]# chmod 777 test.sh [root@wxt shell1]# ./test.sh a b c d ./test.sh a b ③参数个数任意多,但只有前9个被访问到 [root@wxt shell1]# vi test.sh [root@wxt shell1]# sh test.sh a b c d e f g h i j k test.sh a b c d e f g h i a0
向系统命令传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ① # !/bin/bash find /root/shell24 -name $1(在这个目录下查找) [root@wxt shell24]# sh 20.sh passwd ②(其中1.sh,2.sh,passwd为文件) # !/bin/bash cat -n $1 $2 $4 >catfile.log 2>catfile.err [root@wxtshell1]# sh catfile.sh 1.sh 2.sh passwd [root@wxt shell1] [root@wxt shell1]# cat catfile.err ③查看脚本如何执行的步骤 sh -x 1.sh sh -x 1.sh 2.sh
特殊变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 $ $ $脚本运行的当前id号 $ ?显示最后命令执行的状态,0表示正确执行,其他任何值表示错误 $ ! 后台运行的最后一个进程id号 $ @与$*相同,加引号,在引号中返回每个参数 ① vi 0.sh # !/bin/bash echo $# echo $* echo $$ echo $? [root@wxt shell1]# sh 0.sh a fd sdf sadf sdfasdf asdf 6 a fd sdf sadf sdfasdf asdf 8652 0 ② [root@wxt shell1]# echo $? 0 [root@wxt shell1]# lsa -bash: lsa: command not found [root@wxt shell1]# echo $? 127 [root@wxt shell1]# mkdir dir [root@wxt shell1]# test -e dir [root@wxt shell1]# echo $? 0 [root@wxt shell1]# test -e mkakia [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -e mkakia;echo $? 1 [root@wxt shell1]# test -f dir [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -f no [root@wxt shell1]# echo $? 0 [root@wxt shell1]# test -d no [root@wxt shell1]# echo $? 1 [root@wxt shell1]# test -d dir [root@wxt shell1]# echo $? 0
作业3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 Shell 脚本作业: 使用文件重定向功能 将homework.sh脚本执行的结果正确信息输出到/home/hzn/rig.log,错误信息输出到/home/hzn/error.log文件中 sh homework.sh >/home/hzn/rig.log 2>/home/hzn/error.log 将homework.sh脚本执行的结果,标准输出和标准错误放到回收站中 sh homework.sh >/dev/null 2>&1 创建一个定时任务,每个月的13日,15日,25日这几天每十分钟将homework.sh脚本执行的结果,标准输出和标准错误都放到/home/hzn/homework.log中 crontab -e */10 * 13,15,25 * * sh homework.sh >/home/hzn/homeework.log 2>&1 使用at命令,在14:23分执行,查找出/home目录下含有.sh的所有文件,并将标准错误和标准输出都放到/home/hzn/at.log文件中 at 14:23 at> find /home -name "*.sh*" >/home/hzn/at.log 2>&1 at> <EOT> at -l cat /home/hzn/at.log 使用echo输出:2^3 使用echo输出:YOU & ME 使用echo输出:homework.sh have X lines. 【注:X替换成homework.sh的行数】 echo 2^3 echo 'YOU&ME' echo homework.sh have `cat homework.sh|wc -l` lines 设置环境变量var_name=envname和 var_na=you,查看var_name变量,清除系统环境变量var_na vi /etc/profile var_name=envname ar_na=you export $var_name echo $var_name unset var_na 系统变量应该在什么文件中设置,在系统变量配置文件中定义一个系统变量var_os=LinuxRHEL5,能够使用env命令查看该系统变量的值 vi /etc/profile var_os=LinuxRHEL5 source /etc/profile export var_os env |grep var_os 编写脚本myvar.sh,输出当前用户的家目录和当前的系统时间 vi myvar.sh # !/bin/bash cd;pwd echo ~ date sh myvar.sh 在.bash_profile文件中定义一个变量DEST="we are a team.",将其设置为只读变量; vi .bash_profile DEST="we are a team" readonly DEST 编写脚本var4.sh,执行该脚本需要4个参数,输出该脚本的参数个数,输出该脚本的进程ID号,并依次输出所有的参数值,在homework.sh文件中找出含有is的内容,并将结果输出到/home/hzn/homework.is文件中 vi var4.sh # !/bin/bash echo $# echo $$ echo $* grep is homework.sh >/home/hzn/homeework.is sh var4.sh 1 2 3 4 编写脚本test.sh 脚本内容如下 1).读取用户输入,并提示“please write three file name:” 2).判断第一个文件名是否存在,如果存在就输出“the first name is exit”,不存在就输出“the fist name is not exit” 3), 判断第一个文件名是否为目录,如果是就输出“the second name is a director”,不存在就输出“the second name is not a director” 4). 判断第一个文件名是否为文件,如果是就输出“the third name is a file”,不存在就输出“the third name is not a file” vi test.sh # !/bin/bash read -p "please write three file name:" a b c test -e $a && echo "the first name is exit" ||echo "the first name is not exit" test -d $b && echo "the second name is a director" ||echo "the second name is not a director" test -f `echo $c` && echo "the third name is a file" || echo "the third name is not a file" sh test.sh 10. 编写脚本test1.sh 脚本内容如下 1).读取用户输入,并提示“please write two number:” 2).判断第一个数字是否大于第二个数,如果大于就是输出“the first number is more big” 3), 判断第一个数字是否小于第二个数,如果小于就是输出“the second number is more big” 4).判断是否为空,为空则提示“pelease re-enter! ” vi test1.sh # !/bin/bash read -p "please write two number:" a b [ $a -gt $b ] && echo "the first number is more big" [ $a -lt $b ] && echo "the second number is more big" test -z $a && echo "please re-enter!" test -z $b && echo "please re-enter!" [ -z $a] || [ -z$b ] && echo "please re-enter!" sh test1.sh
作业4 expr
1 2 3 4 5 6 7 8 9 10 expr:字符串测试和数值测试 一般用于整数值 expr 5 + 3 expr 5 - 3 expr 5 \* 3 expr 5 / 2(结果为2,不输出小数) a=1 b=1 echo $a + $b =echo $[a+b] =echo $((a+b)) echo $(echo $a + $b)= echo $ `echo $a + $b`
if条件语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 if条件语句 if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi ① # !/bin/bash read -p "please write a number:" a if [ $a -gt 3 ] then echo "大了" else echo "小了" fi ② vi 2.sh # !/bin/bash read -p "please write:" a if [ -z $a ] then echo $aecho $aecho "You did not enter any info." else echo $a fi ③ # !/bin/bash read -p "please write a user name:" name file=`grep $name passwd` if [ -n file ] then echo "String $name is exist" else echo "String $name is not exit" fi 或者 # !/bin/bash read -p "please write a user name:" name if [ -n “`grep $name passwd`”] then echo "String $name is exist" else echo "String $name is not exit" fi ④ # !/bin/bash read -p "please write a number:" a if [ $a -gt 3 ] then echo "大了" elif [ $a -eq 3 ] then echo "等于3" else echo "小了" fi ⑤ # !/bin/bash read -p "please write name:" name if [ -d $name ] then echo "$name is a dir" elif [ -f $name ] then echo "$name is file" else echo "$name is an unknow" fi
case条件选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 case条件选择 case 值(如a;) in 1) 命令1 ;; 2) 命令2 ;; 3|4) 命令3 (|表示或者的意思) *) 命令4 ;; esac ① # !/bin/bash read -p "please write:" a case $a in 1) echo "a" ;; 2) echo "b" ;; 3) echo "c" ;; 4|5) echo "cd" ;; *) echo "unknow" ;; esac ② # !/bin/bash read -p "please write a name:" name case $name in 1) echo $[1+2] ;; 2) pwd ;; 3|4) cat /proce/issue ;; *) echo "Please enter number [1|2|3|4]" ;; esac
for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 for循环 for 变量名(如:i,loop) in列表 do 命令1 命令2 done ① # !/bin/bash for i in 1 2 3 4 do echo $i done ② # !/bin/bash read -p "please write namae:" a b c d e for loop in $a $b $c $d $e do touch $loop done ③ # !/bin/bash for loop do touch $loop done [root@wxt shell24]# sh 9.sh a b c d e (for后面不加in,执行脚本时,输入参数) ④ # !/bin/bash for loop in `seq 10` do echo "$loop * $loop= $[loop * loop]" done ⑤(seq 9输出1-9;seq 2 10;输出2-10)(echo -n 不换行) # !/bin/bash] for i in `seq 9` do for j in `seq 9` do [ $j -le $i ] && echo -n "$i * $j =$[i*j] " done echo " " done [root@wxt shell24]# sh 11.sh 1 * 1 =1 2 * 1 =2 2 * 2 =4 3 * 1 =3 3 * 2 =6 3 * 3 =9 4 * 1 =4 4 * 2 =8 4 * 3 =12 4 * 4 =16 5 * 1 =5 5 * 2 =10 5 * 3 =15 5 * 4 =20 5 * 5 =25 6 * 1 =6 6 * 2 =12 6 * 3 =18 6 * 4 =24 6 * 5 =30 6 * 6 =36 7 * 1 =7 7 * 2 =14 7 * 3 =21 7 * 4 =28 7 * 5 =35 7 * 6 =42 7 * 7 =49 8 * 1 =8 8 * 2 =16 8 * 3 =24 8 * 4 =32 8 * 5 =40 8 * 6 =48 8 * 7 =56 8 * 8 =64 9 * 1 =9 9 * 2 =18 9 * 3 =27 9 * 4 =36 9 * 5 =45 9 * 6 =54 9 * 7 =63 9 * 8 =72 9 * 9 =81 ⑥(输出循环次数) # !/bin/bash n=0 for i in `ls` do echo $i n=$[n+1} done echo $n
作业5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 脚本中不考虑给出的参数为空格的情况 1.写一个脚本,实现创建目录的功能,目录的名称由用户给出,需要对如下情况进行判断处理: (1)用户没有给出参数 (2)用户给出的目录名称是否在当前目录存在,如果存在,提示用户重新创建 (3)目录创建成功或者失败,都给出说明信息 vi 12.sh # !/bin/bash read -p "please write a name:" name if [ -z $name ] then echo "用户没给出参数" elif [ -d $name ] then echo "重新创建" else mkdir $name && echo "目录$name创建成功" ||echo "目录创建$name失败" fi 2. 编写一个脚本,实现如下功能: (1)给用户以下四个选项:Copy,Delete,Backup和Quit (2)读取用户输入的值,当用户输入的值为Copy时输出Copy (3)当用户输入的值为Delete时输出Delete,当用户输入的值为Backup时输出Backup,输入其他值则提示用户“Invalide Selection” # !/bin/bash read -p "please write:" i case $i in Copy) echo Copy ;; echo $a Delete) echo Delete ;; Backup) echo Backup ;; *) echo "lnalide Selection" ;; esac 3. 编写脚本,实现如下功能: 不使用wc -l 命令,计算出当前路径下文件的数量,最终输出如下内容,如: 【There are 10 files in /home】 # !/bin/bash n=0 for i in `ls` do n=$[n+1] done echo "There are $n in /home" 4. 编写脚本,实现如下功能: 使用特殊符号打印三角形。要求整个程序要有交互,运行时可以自动输入打印的行数和用于描绘三角形的特殊符号; 分析:第一行为一个*,第二行为两个* ,第n行为n个*。有两个循环,其中外层:控制:行数。内层:每行输出的*的个数; 打印结果如下: Please enter the number of rows to print:6 Please enter the characters Print:* * ** *** **** ***** # !/bin/bash read -p "Please enter the number of rows to print:" a read -p "Please enter the characters print:" b for j in `seq $a` do for i in `seq $a` do [ $i -le $j ]&& echo -n "$b " done echo " " done 5. 编写一个脚本,实现一下功能: (1)执行脚本时,提示用户输入1到100的数字Please enter init type number from 1 to 100 (2)如果没有输入,则提示Please enter your number. (3)如果输入的数字小于100,则输出该数字到100之间的值, 如用户输入98,则输出: 98 99 100 (4)如果输入的数字大于100,则提示用户Your number is larger than 100. # !/bin/bash read -p "Please enter init type number from 1 to 100" a if [ -z $a ] then echo "Please enter your number" elif [ $a -lt 100 ] then echo `seq $a 100` then seq $a 100(不用echo,直接输出,显示竖行) else echo "Your number is larger than 100" fi 使用循环,添加3个用户test1、test2、test3,判断用户是否存在,存在则输出“<user> exist.”;不存在则添加,并提示用户“<user> add secussful.”其中<user>表示用户名称。 # !/bin/bash for i in test1 test2 test3 do file1=`grep $i /etc/passwd` [ -z $file1 ] && useradd $i && echo "$i add secussful" || echo "$i exist" done # !/bin/bash read -p "please write a name:" a b c for i in $a $b $c do id $i >>/dev/null 2>&1 if [ $? -eq 0 ] then echo "$i exit" else useradd $i echo "$i add succesful" fi done
作业6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 脚本中不考虑给出的参数为空格的情况 1. 使用循环语句,输出 1加到100的结果(至少两种方法) # !/bin/bash b=0 for i in `seq 0 100` do b=$[b+i] done echo $b # !/bin/bash n=0 b=0 while [ $n -le 100 ] do b=$[b+n] n=$[n+1] done echo $b # !/bin/bash n=0 b=0 until [ $n -eq 101 ] do b=$[b+n] n=$[n+1] done echo $b # !/bin/bash b=0 for i in `seq 0 100` do b=$[b+i] done echo $b # !/bin/bash n=0 b=0 while [ $n -le 100 ] do b=$[b+n] n=$[n+1] done echo $b # !/bin/bash n=0 b=0 until [ $n -eq 101 ] do b=$[b+n] n=$[n+1] done echo $b 2. 编写脚本,实现如下功能: 使用特殊符号打印三角形。要求整个程序要有交互,运行时可以自动输入打印的行数和用于描绘三角形的特殊符号; 分析:倒数第一行为一个*,倒数第二行为两个* ,第一行为n个*。有两个循环,其中外层:控制行数。内层:每行输出的*的个数; 打印结果如下: Please enter the number of rows to print:6 Please enter the characters Print:* ****** ***** **** *** ** * # !/bin/bash read -p "Please enter the number of rows to print:" a read -p "Please enter the characters Print:" b for i in `seq $a` do for j in `seq $a` do [ $i -le $j ] && echo -n "$b" done echo " " done 求10以内的自然数的平方值的和。 # !/bin/bash n=1 a=0 while [ $n -le 10 ] do a=$[n*n+a] n=$[n+1] done echo $a 4.编写一个脚本,打印下面的功能,使用break和continue:wq实现: (1)输入1,提示用户需要输入复制的文件或文件夹路径,输入后做个判断,看用户输入的是文件还是文件夹。再提示用户输入目标目录。(实现文件拷贝到文件夹中的功能);复制成功或失败都要给用户提示信息。 (2)输入2,提示用户输入需要删除的文件,输入后判断该文件是否为文件,提示用户是否确定删除,如果输入y,则删除并提示用户【文件】has already deleted,如果输入n则不删除并提示用户【文件】 is not deleted; (3)输入3,则提示用户输入需要备份的文件,文件备份成【文件名.bak】,备份前先判断下有没有重名的文件,如果有重名的文件则提示用户已存在【文件名.bak】,退出备份;如果备份成功,则提示用户【文件】bakup sucessful. (4)输错后,则输出Invalide selection,please try again,但用户可以重新输入,只有输入4,才可以退出菜单。 ****************************** Please select your operation: 1 Copy 2 Delete 3 Backup 4 Quit ****************************** # !/bin/bash Copy( ){ read -p "需要输入复制的文件或文件夹路径:" a if [ -e $a ] then if [ -f $a ] then read -p "用户输入目标目录:" b cp $a $b else "重新输入" fi else "重新输入" fi } Delete() { read -p "输入需要删除的文件" c if [ -f $c ] then read -p "是否确定删除?" d case $d in y) rm -rf $c echo "$c has already deleted" ;; n) echo "$ is not deleted" ;; esac else echo "重新输入" fi } Backup () { read -p "输入需要备份的文件: " e if [ -e ${e}.bak ] then echo 存在${e}.bak else cp $e "${e}.bak" echo "bakup sucessful" fi } Quit () { echo "Invalide selection,please try again" } while read -p "Please select your operation: " f do case $f in 1) Copy break ;; 2) Delete break ;; 3) Backup break ;; 4) break ;; *) Quit continue;; esac done 5. 写一个脚本,和用户进行交互,要求用户输入一个目录名称,通过在脚本中调用函数的方法实现,要求函数能够对这个目录名称进行判断,如果不是目录,也不是文件,则返回1,否则返回0; 如果函数返回1,脚本会继续创建该目录,如果创建失败,返回错误信息,提示用户Create dir failed # !/bin/bash fun () { read -p "输入一个目录名称:" a if [ ! -d $a ] && [ ! -f $a ] then return 1 else return 0 fi } fun while [ "$?" -eq 1 ] do mkdir $a ||echo "Create dir failed" done
作业7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 课前回答问题: ① 判断是否为三角形(不考虑是不是三角形) # !/bin/bash read -p "please write three number:" a b c if [ $a -eq $b -o $a -eq $c -o $b -eq $c ] then echo "等腰三角形" elif [ $a -eq $b -a $a -eq $c ] then echo "等边三角形" else echo "普通三角形" fi ② # !/bin/bash read -p "please write 3 number: " a b c case $a in 1) expr 1 + 1 ;; 2) ps -ef|grep ftp ;; 3) find / -name "*root* >a.log ;; *) echo "please re_enter it" ;; esac while 条件循环 while 条件 do 命令 done 课上习题: 求10以内的自然数的平方值 # !/bin/bash n=1 while [ $n -le 10 ] do echo "$n * $n" =$[n*n] n=$[n+1] done 求n1到n2以内的自然数的平方值 # !/bin/bash read -p "输入两个数字:" n1 n2 if [ $n2 -gt $n1 ] then while [ $n1 -le $n2 ] do echo "$n1 * $n1=$[n1*n1]" n1=$[n1+1] done else echo "重新输入" fi for循环做不到,while做得到的循环 [root@wxt shell29]# cat a.text afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj # !/bin/bash for i in `cat a.text` do echo $i sleep 1 done [root@wxt shell29]# sh 00.sh afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj cat a.text|while read line do echo $line sleep 1 done [root@wxt shell29]# sh 111.sh afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj afhia aksjfdioas askdjfgiaj ②(passwd里有/bin/bash的是可登陆用户) # !/bin/bash cat passwd|while read line do echo "$line" n=`echo "$line" | grep /bin/bash` if [ -z "$n" ] then echo "NO " else echo "YES" fi sleep 1 done until: until 条件 do 命令 done # !/bin/bash i=1 until [ $i -eq 11 ] do echo "$i * $i =$[i*i]" i=$[i+1] done continue和break用在while,for,if语句中break 跳出循环;continu回到循环开始的地方break2跳出整个循环 continue: # !/bin/bash for i in 1 2 3 4 5 6 do [ $i -eq 3 ] && continue echo $i done [root@wxt shell29]# sh 8.sh 1 2 4 5 6 break: # !/bin/bash for i in 1 2 3 4 5 6 do [ $i -eq 3 ] && break echo $i done [root@wxt shell29]# sh 9.sh 1 2 a++;b--(a=a+1;b=b-1) # !/bin/bash for ((i=2;i<=100;i=i*2)) do echo "$i" done 函数: # !/bin/bash fun( ) { echo $1 echo $2 echo $3 echo $4 } fun a b c d cd $HOME=cd =cd ~到家目录
作业8 基础篇: 添加练习文本ourpractise.txt,文本内容为《shell课后练习31-文件内容.txt》中的内容,文本添加完成后格式应如下图所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Archive: drgeo-oneclick.zip Length Method Size Ratio Date Time CRC-32 Name -------- ------ ------- ----- ---- ---- ------ ---- 0 Failed 0 0 % 10 -01 -08 03 :53 00000000 dg/ 255 Defl:N 180 29 % 09 -28 -08 16 :35 4 a44e01b dg/drgeo.ini 193 Defl:N 156 19 % 09 -28 -08 16 :38 d8a04bc6 dg/drgeo.sh 432 Defl:N 276 36 % 09 -28 -08 17 :59 02381895 dg/ChangeLog 7639 Defl:N 2621 66 % 01 -31 -08 04 :19 75312e7 a dg/LICENSE 995840 Defl:N 379701 62 % 11 -10 -07 16 :37 bf870ea0 dg/drgeo.exe 0 Stored 0 0 % 09 -28 -08 18 :08 00000000 dg/c/ 2336 Defl:N 679 71 % 09 -28 -08 18 :07 e3415ff4 dg/c/Info.plist 8 Stored 8 0 % 06 -10 -07 08 :25 00f a327e dg/c/PkgInfo 0 Failed 0 0 % 10 -01 -08 04 :18 525 g0000 dg/c/res/ 0 Stored 0 0 % 11 -18 -07 00 :28 00000000 dg/c/MacOS/ 0 Failed 0 0 % 09 -22 -08 02 :55 00000000 dg/c/Linux686/ 38206 Defl:N 9537 75 % 09 -28 -08 17 :18 094 d9a57 dg/c/res/drgeo.icns 2320771 Defl:N 546350 77 % 10 -01 -08 04 :17 48525057 dg/c/res/drgeo.changes 18141632 Defl:N 8169067 55 % 10 -01 -08 04 :17 d2e65bd2 dg/c/res/drgeo.image 0 Stored 0 0 % 10 -01 -08 04 :18 00000000 dg/c/res/My Squeak/ 0 Stored 0 0 % 10 -01 -08 02 :47 00000000 dg/c/res/secure/ 0 Stored 0 0 % 10 -01 -08 03 :53 00000000 dg/c/res/examples/ 941 Defl:N 313 67 % 10 -01 -08 02 :47 edb9783f dg/c/res/secure/Squeak.keys 13751 Failed 1494 89 % 12 -22 -06 19 :33 9 d788893 dg/c/res/examples/wheel.fgeo 4372 Defl:N 676 85 % 12 -22 -06 19 :33 b02000db dg/c/res/examples/varignon.fgeo 9341 Failed 1120 88 % 12 -22 -06 19 :33 d854c80f dg/c/res/examples/triangles-othetiques.fgeo 1803 Defl:N 365 80 % 01 -29 -08 05 :41 c0e75f9c dg/c/res/examples/tetraedre.fgeo 4256 Defl:N 697 84 % 12 -22 -06 19 :33 915739e6 dg/c/res/examples/ref raction.fgeo 6016 Defl:N 818 86 % 01 -29 -08 05 :41 1739701 a dg/c/res/examples/pyramide_base_rect.fgeo 7823 Defl:N 941 88 % 12 -22 -06 19 :33 6318 b04f dg/c/res/examples/mercedes.fgeo 7574 Defl:N 1042 86 % 12 -22 -06 19 :33 49 daf029 dg/c/res/examples/lens.fgeo 12137 Defl:N 1183 90 % 01 -29 -08 05 :34 adb74826 dg/c/res/examples/exemple_3d.fgeo 3789 Defl:N 618 84 % 12 -22 -06 19 :33 9711f ecc dg/c/res/examples/euler-line.fgeo 6921 Defl:N 874 87 % 01 -29 -08 05 :08 21693921 dg/c/res/examples/cube.fgeo 2054 Defl:N 473 77 % 12 -22 -06 19 :33 5 aaef865 dg/c/res/examples/angle-inscrit.fgeo 2587868 Defl:N 1050245 59 % 06 -10 -07 08 :27 6f 243f86 dg/c/MacOS/squeak 22399 Defl:N 9495 58 % 11 -10 -07 17 :45 4632473 c dg/c/Linux686/AioPlugin 17144 Defl:N 7963 54 % 11 -10 -07 17 :45 d83c7211 dg/c/Linux686/npsqueak.so 29128 Defl:N 12871 56 % 11 -10 -07 17 :45 12889f 3a dg/c/Linux686/PseudoTTYPlugin 2853195 Defl:N 1000109 65 % 11 -10 -07 17 :45 c4e06d64 dg/c/Linux686/squeak 167923 Defl:N 74932 55 % 11 -10 -07 17 :45 dac39dcf dg/c/Linux686/Squeak3D 91930 Defl:N 34071 63 % 11 -10 -07 17 :45 4 a43f2a5 dg/c/Linux686/UnixOSProcessPlugin 87661 Defl:N 38083 57 % 11 -10 -07 17 :45 5 b09e49b dg/c/Linux686/vm-display-fbdev 18363 Defl:N 7230 61 % 11 -10 -07 17 :45 69 dec6cf dg/c/Linux686/vm-display-null 159358 Defl:N 70409 56 % 11 -10 -07 17 :45 684 a8a9d dg/c/Linux686/vm-display-X11 36270 Defl:N 14162 61 % 11 -10 -07 17 :45 480e228 e dg/c/Linux686/vm-sound-ALSA 12797 Defl:N 5083 60 % 11 -10 -07 17 :45 5 c4a1e29 dg/c/Linux686/vm-sound-null 54917 Defl:N 21578 61 % 11 -10 -07 17 :45 b5e6c293 dg/c/Linux686/vm-sound-OSS 21170 Defl:N 9001 58 % 11 -10 -07 17 :45 a6511bd8 dg/c/Linux686/XDisplayControlPlugin -------- ------- --- ------- 27748213 11474421 59 % 45 files
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 基础篇: 1. 添加练习文本ourpractise.txt,文本内容为《shell课后练习31-文件内容.txt》中的内容,文本添加完成后格式应如下图所示: 2. 根据ourpractise.txt,完成下面的练习 (1) 输出Length和Name两列的值 awk '{print $1,$8}' ourpractise.txt (2) 打印出第二行和最后两行 sed -n '2p' ourpractise.txt && tail -2 ourpractise.txt (3) 打印出第二行,第三行和Method值为Stored的行 (4) 不显示含有dg/c/res/examples的行 grep -v dg/c/res/examples ourpractise.txt (5) 找出b后面有一个或者两个0的行 grep "b0\{1,2\}" ourpractise.txt (6) 找出含有三个或三个以上0的行 grep "0\{3,\}" ourpractise.txt (7) 找出含有a4或者a8的行 grep "a[48]" ourpractise.txt (8) 找出只含有字母的行 grep -v "[^a-zA-Z]" ourpractise.txt (9) 输出Method和Name两列的值,再找出以S开头的行 awk '{print $2,$8}' ourpractise.txt |grep ^S (10) 输出Method和Name两列的值,再找出以F开头,以/结尾的行 awk '{print $2,$8}' ourpractise.txt |grep ^S.*/$ (11) 找出e和b之间有两个字符的行 sed -n '/e..b/p' ourpractise.txt grep e..b ourpractise.txt (12) 取每行50-100个字符的内容,并删除以数字开头的行 cut -c 50-100 ourpractise.txt |sed '/^[0-9]/d' (13) 找出含有00000000的行,将00000000替换为Eight zero sed -n '/00000000/p' ourpractise.txt |sed 's/00000000/Eight zero/g' (14) 删除第8-20行 sed '8,20d' ourpractise.txt 3. 解释下列脚本(逐行解释,写出该脚本实现的功能) # Source function library. ./etc/init.d/functions test -x /usr/sbin/atd || exit 0 RETVAL=0 # # See how we were called. # prog="atd" start() { # Check if atd is already running if [ ! -f /var/lock/subsys/atd ]; then echo -n $"Starting $prog: " daemon /usr/sbin/atd RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/atd echo fi return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc /usr/sbin/atd RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/atd echo return $RETVAL } restart() { stop start } reload() { restart } status_at() { status /usr/sbin/atd } case "$1" in start) start ;; stop) stop ;; reload|restart) restart ;; condrestart) if [ -f /var/lock/subsys/atd ]; then restart fi ;; status) status_at ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" exit 1 esac exit $? exit $RETVAL 提高篇: 中级: 编写脚本setup.sh,脚本自动安装jdk和tomcat,自动安装mysql数据库,完成oa系统的自动安装。 高级: 完善setup.sh脚本,脚本中需要有如下判断,并适当增加函数实现: (1)在函数中实现,判断系统是否已经安装过jdk,如果已经安装,输出jdk的版本号,打印信息,提示系统已经安装过jdk并退出安装 (2)在函数中实现,判断系统是否已经启动tomcat,如果启动tomcat,提示系统已经启动tomcat并退出安装 (3)在函数中实现,判断系统是否已经安装mysql数据库,如果已经安装,打印信息,提示已经安装并且退出安装