十二、输入输出重定向及管道
1 什么是过滤器 必须有一个输入和输出
2 什么是标准输入输出
3 怎样改变标准输出
4 输出的种类
5 改变输入
6 管道
linux过滤器:
linux工具/命令分为三种:
过滤器
编辑器
交互式工具
标准输入输出与重定向:
输入 过滤器数据来源 标准输入stdin(0):默认是键盘
输出 过滤器数据去向 标准输出stdout(1):默认是终端屏幕
错误输出 报错讯息与标准输出走不同的I/O通道 标准错误输出stderr(2):默认是终端屏幕
重定向 标准输入输出与错误输出,都可以用特定符号改变数据来源和去向
输入重定向: 使用“<”来重定向输入
很多工具都设置其后接文件名为输入源
也有一些过滤需要添加“<”以明确输入源
追加: 使用“<<”让系统将一次键盘的全部输入,先送入虚拟的当前文档,再一次性输入追加到文档尾部
需要一对字母、符号或字符串作为起始终结标识符
选择任意符号作为起始终结标识符
<<EEE 表示直到发现输入EEE时,才退出输入,或按ctrl+d退出 并显示输出
输出重定向: 使用“>”改变数据输出目标
ls -l /etc > listfile
将文件以长模式显示,后写入listfile文件
文件已有内容会被替代
覆盖与追加: 使用“>”进行输出重定向,文件的原内容会被覆盖
ls -l aa.txt > vi.txt
使用“>> ”,可以将输出追加入文件
ls -l aa.txt >> vi.txt
> 标准正确输出重定向、清空文件、创建文件(输出前先清空以前存在的数据)
2> 标准的错误输出重定向 (输出前先清空以前存在的数据)
&>或2>&1 不管正确或错误的输出都全部重定向
>> 追加重定向,不清空之前的数据
错误输出重定向:系统错误与标准输出使用的I/O管道不同
默认情况系统报错显示到终端屏幕上
使用“2>”将报错信息重定向入一个文件
find / -type s 2> /dev/null
使用“2>>”将报错信息追加入一个文件
find / -name passwd 2>> results
管道:
| 将前一个过滤器的输出直接输入到后一个过滤器
ls -l | grep hosts.conf
允许多重管道
管道前过滤器的输出与管道后过滤器的输入数据类型匹配
例子:
ls /dev |wc -l 统计/dev下有多少文件
du -a | sort -n -r 显示所有文件大小,并按从大到小排序
ls -l /etc |grep '^d' 显示/etc文件夹下所有文件夹
dmesg |more 分屏显示内核信息
使用tr加密: tr '"a-m""n-z""A-M""N-Z"' '"N-Z""A-M""n-z""a-m"'
tr '"a-m""n-z""A-M""N-Z"' '"N-Z""A-M""n-z""a-m"' < /etc/passwd > abc.txt
tr '"a-m""n-z""A-M""N-Z"' '"N-Z""A-M""n-z""a-m"' < /etc/passwd | mail -s "for you" dlp8410@126.com
十三、 linux系统状态检测及进程控制
1 查询当前系统的信息
2 查询当前系统的状态
3 /proc文件系统 查看内核
4 进程的显示
5 控制进程
6 控制台的前台和后台
系统信息的收集:
hostname 显示或设置主机名
uname 显示系统信息
last 显示最近的用户登录
lastlog 显示每个用户的登录情况
系统状态:
/proc文件系统
free 查看内存的使用情况
df 查看硬盘使用情况
du 查看文件大小
系统日志 tail - f /var/log/messages
常用系统日志:
/var/log/dmesg 核心启动日志
/var/log/messages 系统报错日志
/var/log/maillog 邮件系统日志
/var/log/boot.log 系统引导过程日志
/var/log/cron 记录守护进程派生子进程
/var/log/syslog 记录警告信息
/var/log/wtmp 永久记录用户登录事件
/var/log/xferlog 记录FTP会话
/var/log/secure 安全信息
常见查看日志的方法 tail /var/log/....
了解进程:
系统通过进程来完成工作
每一个进程都有一个独立的进程号,系统通过调用进程号来调度操控进程
系统和原始进程是init init的PID总是1
一个进程可以产生另一个进程,除了init以外,所有的进程都有父进程
linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性
交互进程 由一个shell启动的进程,交互进程可以在前台运行,也可以在后台运行
批处理进程 这种进程和终端没有联系,是一个进程序列
监控进程 也称守护进程,linux系统启动时启动的进程,并在后台运行。
一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令
作业控制指的是控制正在运行的进程的行为
查看进程状态:
ps [option] 常用参数
-a 显示所有进程,但不包括不隶属于任何一个终端的进程
-u 显示不属于任何一个终端的进程,诸如各类系统网络服务的后台程序
-l 以长模式显示进程信息
-u 显示进程的拥有者信息
在ps的参数中,是否加 - 号,表示不同的参数
ps显示中的stat,
R 正在运行
S 进程睡眠中,通常可以因事件发生而被唤醒
T 进程已停止
D 进程睡眠中,除非发生指定事件,否则不会被唤醒
Z 僵尸进程,例如未能被父进程回收的子进程。通常是一个系统BUG或非法操作
< 高优先级进程
N 低优先级进程
ps选项
-e 显示所有进程
-f 全格式
-h 不显示标题
-l 长格式
-w 宽输出
a 显示终端上的所有进程,包括其他用户的进程
r 只显示正运行的进程
x 显示没有控制终端的进程
--help 显示帮助信息
--version 显示命令的版本信息
pstree 以树状方式表现进程的父子关系
top 系统监控工具
按 M 以内存排序
k 杀掉某个进程
? 帮助
>< 翻页
r 设置优先级
q 退出TOP命令
控制进程:
kill [-signal] PID 向进程传送一个特定的讯号 默认为15(终结)
kill -l 列出所有可以由kill传递的讯号
killall
skill
pkill
进程优先级:
进程俦级 用nice值来表示
nice以一个不同的nice值来运行指令 nice -n -num command
renice改变运行进程的nice值 renice -n PID
renice -n -10 1 调整优先级
控制台的前台和后台:
命令默认在前台运行
但控制台可以都允许多个后台进程,如 find / -name aaa & 直接运行在后台
进程放入后台运行:
command & 将进程直接丢入后台运行
ctrl+z 将正在运行的前台进程暂停,并丢入后台
nohup command & 在shell退出后进程仍执行,作为系统进程
控制台的任务:
jobs 显示系统当前后台任务列表
kill %n 控制第1个任务
fg 将后台进程放入前台,并运行
bg 激活后台暂停的进程
十四、 BASH使用详解
1 shell概念
2 linux下的shell种类与用户shell的控制
3 bash的使用
4 bash的常见技巧与快捷键
5 bash的变量使用
6 常见的bash变量使用
7 bash运算符
8 使用启动脚本定制bash
shell简单介绍:
shell环境
shell产生与发展
shell的显著特点: 命令行解释
使用保留字
使用shell元字符(通配符)
可处理程序命令
使用输入输出重定向和管道
维护一些变量
运行环境变量
支持shell编程
bash介绍:
系统中的shell
改变用户使用的shell
bash命令概要: 如下是几个最常用的bash内部命令
alias 设置bash别名
bg 使一个被挂起的进程在后台继续执行
cd 改变当前工作目录
exit 终止shell
export 使变量的值对当前shell的所有子进程都可见
fc 用来编辑历史命令列表里的命令
fg 使用一个被挂起的进程在前台继续执行
kill 终止某个进程
help 显示bash内部命令的帮助信息
pwd 显示当前工作目录
unalias 删除已定义的别名
bash还有许多命令,但这些是最常用的,想了解更详细的情况,可以man bash
bash变量: 这里有几个最有用的bash变量
包括变量名和简单描述
HISTFILE 用于贮存历史命令的文件
HISTSIZE 历史命令列表的大小
HOME 当前用户的用户目录
OLOPWD 前一个工作目录
PATH 寻找可执行文件的搜索路径 ~/.bash_profile
PS1 命令行的一级提示符
PS2 命令行的二级提示符
PWD 当前工作目录
SECONDS 当前shell开始后所流逝的秒数
bash的特性:
1 命令补齐——TAB键
2 有很多快捷键
3 通配符
4 命令历史记录 history
5 别名 命令别名通常是其它命令的缩写,用来减少键盘输入
6 输入重定向 <
7 输出重定向 >
8 管道 |
9 提示符
10 作业控制(JOB CONTROL)
11 用户化配置bash
bash变量快捷键:
1 TAB: 自动补完命令行与文件名
2 TAB键双击: 可以列出所有匹配的选择
3 Ctrl+c: 结束当前的任务
4 Ctrl+z: 当前任务暂停,并放在后台
5 Ctrl+s: 停止屏幕输出
6 Ctrl+q: 恢复屏幕输出
7 Ctrl+l: 清屏
8 Ctrl+d: 标准输入结束
9 Ctrl+r: 追踪命令
bash在控制台下的其他快捷键:
ctrl+u 删除光标以前的所有字符
ctrl+d 一个字符
ctrl+k 删除光标以后的所有字符
ctrl+h 一个字符
ctrl+t 调换光标前两个字符的次序
ctrl+a 移动光标到最前面
ctrl+e 最后面
ctrl+p 上一个命令
ctrl+n 下一个命令
ctrl+f 移动光标到后一个字符
ctrl+b 移动光标到前一个字符
ctrl+x 标记一个位置
ctrl+c 清除当前的输入 (常用)
使用BASH命令历史: history命令可查询历史操作命令
命令历史中的命令可以被调用
.bash_history中的命令数目由HISTFILESIZE这个变量来决定
history表存储在内存内。用户logout时会记录到用户主目录中.bash_history文件
# history
# set |grep HIS
# history -c 清除命令历史
使用历史命令: 使用!来调用历史指令
ctrl+r在history中查询指令
!$ 获得前面命令行中的最后一项内容
!! 重复执行上一条命令
!a 重复执行上一条以a为首的命令
!100 重复执行第100号命令
bash的变量类型:分环境变量和普通变量
环境变量:可以被子shell引用的变量
普通变量:只在当前shell中有效
set 显示环境变量和普通变量
env 只显示环境变量
export 把普通变量变成环境变量
unset 可以删掉一个变量
alias别名: 为命令定义简单的别名
unalias取消别名记录
alias记录在shell中总是先执行
bash中的运算符:已经接触过的通配符* ? [abc] {a,b,c}等
一些运算符,
如echo $PATH中的$
!10 中的!
另外我们还要学习以下运算符
! !20 !! !$ $AAA * ? [abc] [^abc] {a,b,c} & ~ # %1 ^ "" '' `` \ ; = < > $$
[ ] 加空格有来表示判断 ,判断条件: -f 文件
-l 链接
-d 目录
-c 字符型文件
-b 块设备文件
-x 执行文件
-r 只读文件
-w 可写文件
man bash可查
&& 当前一条指令执行成功时再执行后一条指令
|| 失败时再执行
$$ 显示pid
定制你的bash:
在bash中定制的:命令历史、变量、umask、选项 set -o、alais等
只在当前shell有效,再次打开将恢复成原来shell启动脚本中定义的样子
bash的启动脚本:
全局设置文件: /etc/profile
/etc/bashrc
用户设置文件: ~/.bash_profile
~/.bashrc
bash的其它配置脚本:
~/.bash_logout
~/.bash_history logout时将内存history记录写入
/etc/profile.d/*.sh
十五、 shell脚本编程详解
1 什么是shell脚本编程 其它脚本php,jsp,asp,
系统是由shell脚本搭建的,如/etc/rc.d/rc.sysinit或services命令
shell脚本一般是ASCII码的文本,可以直接编写
脚本中的#表示注释,但是第一行中的#有特殊意义:
如果第一行中:
第一个字符非#:表示这是一个BASH脚本
第一个字符是#,但第二个字符不是!:表示这是一个csh脚本
第一个字符是#,且第二个字符是!:表示调用其后指定的某个程序来执行以下的这个脚本。如#!/usr/bin/python2.2
2 脚本的执行方式
3 脚本的常见流程控制
4 脚本的编写
5 sed及awk的使用
shell脚本: shell script
unix系统的原则有一条:UNIX系统和程序都比较短小,避免交互
所以在完成复杂任务时需要把短小命令组合起来使用,怎样组合呢?就是用shell脚本
shell script通常为text文本文件,shell的脚本最善长用来完成系统管理工作;
shell 有很多种,不同的shell语法是不相同的,如csh的脚本bash不一定可以用
shell脚本可以进行多种形式的交互
整个系统都是由shell脚本来串连的
甚至很多命令就是shell脚本 service 命令、startx命令等等
shell中正则表达式:
正则表达式简介
grep和正则表达式
vi和正则表达式
与shell脚本进行交互:
可以使用参数来传递内容 $1 $2 $3
可以使用命令来进行交互 read 读入数据给变量
echo 输出数据
printf 输出数据
echo "this if input & output!"
read -p "this is read,please input:"readmem
echo "this is echo:$readmem"
printf "this is printf %s" $readmem
shell脚本执行:
输入脚本的绝对路径或相对路径
/root/backup
./backup
bash脚本或tcsh脚本
表示以bash或tcsh来执行脚本 bash /root/backup
再脚本的路径前加 . . ./backup
. /root/backup
bash脚本中的流程控制:
条件判断控制
[] && ||
if
case
循环控制
while
utile
for
break
continue
[ ]
echo $?
vi /etc/rc.d/rc.sysinit
vi /etc/rc.d/init.d/httpd
bash -vx ./b 编译
[]在bash 可以判断真假,
[ $USER = "ding" ] && echo hello ding
[ -f /bin/ls ] && /bin/ls
[ $USER = "ding" ] || echo hello root
-e file已经存在
-f file普通文件
-s file大小不为零
-d file是一个目录
-r file对当前用户可以读取
-w file可写
-x file可执行
-g file的GID标志被设置
-u file的UID标志被设置
-O file是属于当前用户的
-G file的组ID和当前用户相同
file1 -nt file2 文件file1比file2更new
file1 -ot file2 文件file1比file2更old
数值比较时的运算符:
-eq =
-ne !=
-gt >
-lt <
-ge >=
-le <=
-z 为空
-n 不为空
条件判断控制语句if:
if 条件
then 动作
elif 条件
then 动作
else
动作
fi
例子:
if[ $1 = "hello" ]
then
echo "hello!hahah"
fi
if [ $1 = 1 ]; then
if [ $2 = 2 ]; then
echo ok
fi
fi
条件判断控制语句CASE:
case 表达式 in
匹配值1)
动作;;
匹配值2)
动作;;
*)
动作;;
esac
例子:
case $1 in
root)
echo "hello root"
;;
ding)
echo "dear i miss you"
;;
*)
echo "where are you"
;;
esac
循环控制语句for:
for 变量 in 数组
do
动作
done
for,变量自动去数组中取值,每取一次值执行一次循环,
例子:
for i in 1 2 3 4 /etc/*rc
do
echo $!
done
循环控制语句while:
while 条件
do
动作
done
while,当条件为真时,执行do和done间的循环
例子: aaa=0
while [ $1 = "ok" ] && [ $aaa -lt 10 ]
do
aaa=$[$aaa+1] 执行运算
echo "$aaa "
done
循环控制语句until:
until 条件
do
动作
done
例子:
aaa=0
until [ $aaa -gt 9 ]
do
aaa=$[$aaa+1]
echo "$aaa "
done
与while循环只是条件相反
函数的使用:
bash 中的函数定义非常简单
使用:
myfunction()
{
}
取消函数或变量时使用: unset myfunction
例子:计算整数平方的例子
square(){
aaa="$1*$1"
return $aaa
}
square $1
result=$?
echo $result
exit 0
sed: 流编辑器 stream editor
sed编辑器是linux 系统管理员的工具包中最有用的资产之一
sed非常适合脚本中使用,因为不需要进行交互
流编辑器非常适合执行重复的编辑,比如替换文件中的词语等。
使用sed进行替换: sed 's/{old value}/{new value}/'
多次替换: sed -e 's/mike/todd/' -e 's/good/better/'
sed 's/tiger/wolf/; s/after/before/'
了解sed脚本: 编辑内容可以写成脚本
脚本是包含sed命令的文本文件
执行命令列上的编辑指令
sed编辑指令
执行档案内的编辑指令
执行多个档案的编辑
执行sed输出控制
info sed
man sed
awk的使用: awk是一种用于处理文本的编程语言工具
unix/linux功能最强大的数据处理引擎
可以在匹配的行上执行特殊的操作
shell中最常用于截取文本中某一段数据
awk程序: 规则通常由新行来分离
规则包含一个模式和在{}内包含的操作
pattern {action}
运行awk程序: 简单的程序可以在命令行下直接输入:$awk 'program' input file
更长的程序保存在文件中 $awk -f program_file input_file
awk实例: 用awk搜索文件/etc/passwd中包含"bash"字符串的行
$awk '/bash/ { print }' /etc/passwd
更加复杂的awk实例: 统计/project目录下所有属于用户joshua的文件的总大小
#ls -l /project |awk '$3=="joshua" {\sum+=$5 } END {print sum }'
何时使用awk: 从大量的原始数据中产生报告
从其它程序的输出中总结信息
当你需要一个又小又快的文本处理程序的时候