`
Fangrn
  • 浏览: 798358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux bash(2)

阅读更多

十二、输入输出重定向及管道

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: 从大量的原始数据中产生报告
   从其它程序的输出中总结信息
   当你需要一个又小又快的文本处理程序的时候

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics