八、Linux 管道、重定向及文本处理

8.1、Linux 多命令协作:管道及重定向

8.1.1 开源文化

  • 开源文化的核心理念之一就是不要重复发明轮子,很多的开源软件都是现有软件、代码、功能的重新组合,就好像通过零件装配机器一样,源代码的开放和共享让这成为了可能,同时也大大的提高了效率和生产力。

8.1.2 管道和重定向

  • 在 Linux 系统当中,大多数命令都很简单,很少出现复杂功能的命令,每个命令往往只实现或一个或几个很简单的功能,我们可以通过将不同功能的命令组合在一起使用,以达到完成某个复杂功能的目的。
  • Linux 中,几乎所有命令的返回数据都是纯文本的(因为命令都是运行在 CLI 下),而纯文本形式的数据又是大多数命令的输入格式,这就让多命令协作称为可能
  • Linux 的命令向我们提供了管道和重定向机制,多命令协作就是通过管道和重定向完成的。
  • 命令行 shell 的数据流有以下定义:
名称 说明 编号 默认
STDIN 标准输入 0 键盘
STDOUT 标准输出 1 终端
STDERR 标准错误 2 终端
  • 命令通过 STDIN 接收参数或数据,通过 STDOUT 输出结果或通过 STDERR 输出错误
  • 通过管道和重定向我们可以控制 CLI 的数据流
分类 关键字 定义 例子
重定向 > 将STDOUT重定向到文件(覆盖) echo "linuxcast.net" > outfile ls -l > outfile
重定向 >> 将STDOUT重定向到文件(追加) echo "linuxcast.net" >> outfile data >> outfile
重定向 2> 将STDERR重定向到文件(覆盖) ls nothere 2> errorout
重定向 2>&1 将STDERR 与 STEOUT 结合 ls nothere 2>&1 alloutput
重定向 < 重定向STDIN grep linuxcast < /etc/passwd
管道 | 将一个命令的 STDOUT 作为另一个命令的 STDIN ls -l | grep linuxcast find / -user linuxcast | grep video find / -user linuxcast 2> /dev/null | grep video
  • 管道通常用来组合不同的命令,以实现一个复杂的功能
  • 重定向通常用来保存某命令的输出信息或错误信息,可以用来记录执行结果或保存错误信息到一个指定的文件夹

8.2、Linux 命令行文本处理工具

8.2.1 文件浏览

  • cat 查看文件内容
  • more 以翻页形式查看文件内容(只能向下翻页)
  • less 以翻页形式查看文件内容(可上下翻页)
  • head 查看文件的开始10行(或指定行数)
  • tail 查看文件的结束10行(或指定行数)

8.2.2 基于关键字搜索

  • 命令 grep 用以基于关键字搜索文本,如:

    • grep 'linuxcast' /etc/passwd 单个关键字可以不使用‘’
    • find / -user linuxcast | grep Video
    • find / -user linuxcast 2> /dev/null | grep Video
  • grep 常用参数:
    • -i 在搜索的时候忽略大小写
    • -n 显示结果所在行数
    • -v 输出不带关键字的行
    • -Ax 在输出的时候包含结果所在行之后的指定行数
    • -Bx 在输出的时候包含结果所在行之前的指定行数

8.2.3 基于列处理文本

  • 命令 cut 用以基于列处理文本内容

    • cut -d: -f1 /etc/passwd
    • grep linuxcast /etc/passwd | cut -d: -f3
  • 常用参数:
    • -d 指定分隔字符(默认是 Tab)
    • -f 指定输出的列号
    • -c 基于字符进行切割 : cut -c2-6 /etc/passwd

8.2.4 文本统计

  • 命令 wc 用以统计文本信息(word count)

    • wc linuxcast
  • 常用参数:
    • -l 只统计行数
    • -w 只统计单词
    • -c 只统计字节数
    • -m 只统计字符数

8.2.5 文本排序

  • 命令 sort 用以对文本内容进行排序

    • sort linuxcast
  • 常用参数:
    • -r 进行倒序排序
    • -n 基于数字进行排序
    • -f 忽略大小写
    • -u 删除重复行
    • -tc 使用 c 作为分隔符分隔为列进行排序
    • -kx 当进行基于指定字符分隔为列的排序是,指定基于哪个列排序

8.2.6 删除重复行

  • 命令 sort -u 可以用以删除重复行
  • 命令 uniq 用以删除重复的相邻行

8.2.7 文本比较

  • 命令 diff 用以比较两个文件的区别

    • diff linuxcast linuxcast.net
  • 常用参数:
    • -i 忽略大小写
    • -b 忽略空格数量的改变
    • -u 统一显示比较信息(一般用以生成 patch (补丁)文件)
      • diff -u linuxcast linuxcast-new > final.patch

8.2.8 拼写检查

  • 命令 aspell 用以显示检查英文拼写

    • aspell check linuxcast
    • aspell list < linuxcast

8.2.9 处理文本内容

  • 命令 tr 用以处理文本内容 (translator)

    • 删除关键字:tr -d 'TMD' < linuxcast
    • 转换大小写:tr 'a-z' 'A-Z' < linuxcast

8.2.10 搜索替换

  • 命令 sed 用户搜索并替换文本

    • sed 's/linux/unix/g' linuxcast
    • sed '1,50s/linux/unix/g' linuxcast
    • sed -e 's/linux/unix/g' -e 's/nash/nash_su/g' linuxcast
    • sed -f sededit linuxcast ( 是将 's/linux/unix/g' 搜索替换文件保存在 sededit 文件中,然后使用 -f 参数去调用这个文件 )

九、Linux 系统启动详解

9.1、BIOS

  • BIOS (Basic Input Output System) 我们称之为基本输入输出系统,一般保存在主板上的 BIOS 芯片中
  • 计算机启动的时候第一个运行的就是 BIOS ,BIOS 负责检查硬件并且查找可启动设备
  • 可启动设备在 BIOS 设置中进行定义,如 USB、CDROM、HD

9.2、MBR

  • BIOS 找到可启动设备后执行其引导代码
  • 引导代码为 MBR 的前446字节

9.3、GRUB

  • Grub 是现在 Linux 使用的主流引导程序
  • 可以用来引导现在几乎所有的操作系统
  • Grub 的相关文件保存在 /boot/grub 目录中
  • Grub 配置文件为 /boot/grub/grub.conf
  • 配置格式:
title CentOS
root (hd0,1)
kernel /boot/vmlinuz-2.6.32-279.e16.i686 ro root=UUID=77272833-B6BB-4D53-B043-9541D1102EBD
initrd /boot/initramfs-2.6.32-279.e16.1688.img

9.4、KERNEL

  • MBR 的引导代码将负责找到并加载 Linux 内核
  • Linux 内核保存在 /boot/vmlinuz-2.6.32-279.e16.i686
  • 一般还会加载内核模块打包文件 :/boot/initrammfs-2.6.32-279.e16.i686.img
  • Linux 为何保持 kernel 的精简将一些不常用的驱动、功能编译成为模块,在需要的时候动态加载,而这些模块被打包保存为一个 initramfs 文件
  • 早期版本 Linux 使用 initrd 文件,initfamfs 是 initrd 的替代优化版本,比 initrd 更加节省空间,更加灵活
  • 命令 dmesg 可以查看本次启动时内核的输出信息

9.5、INIT

  • init 是 Linux 系统中运行的第一个进程
  • 调用 /etc/rc.d/rc.sysinit 负责对系统进行初始化,挂载文件系统,并且根据运行级别启动相应服务
  • Linux 运行级别:
    • 0 关机
    • 1 单用户模式
    • 2 不带网络的多用户模式
    • 3 多用户模式
    • 4 未使用
    • 5 X11 图形化模式
    • 6 重新启动
  • 可以通过 /etc/inittab 配置文件修改默认的运行级别
  • 每个级别对应的启动服务保存在 /etc/rc.d/rc[0123456].d 中
  • 命令 runlevel 可以显示当前及上一个运行级别
  • 命令 init 可用以改变当前运行级别
    • init 3
    • init 5

9.6、单用户修改 ROOT 密码

  • 为内核传递参数 “ 1 ” 或 “ single ” 可系统进入单用户模式
  • 单用户模式下不启动任何服务
  • 单用户模式直接以 root 用户登录,并且不需要密码
  • 可以使用 passwd 修改 root 密码
    • 启动时在引导页面按上下键暂停,可以按 e 键编辑引导页,选择 kernel 一行,再按 e 键就可以编辑,默认光标在最后,输入 1 后回车,然后按 b 启动,这是内核就被强制以单用户模式启动了,启动完成之后就可以更改 root 用户密码,更改完成后输入 exit 回车后系统就退出单用户模式按正常模式启动了
    • 这种方式也有一个安全隐患,只要任何人任何用户能够物理的接近计算机,他就只需要将计算机重启,然后引导的时候给内核传入参数能够修改 root 密码,这样很危险,为了防止这样的任何人只要能接近计算机就能够修改密码的事情发生,grub 就加入了一个加密的操作。

9.7、GRUB 加密

  • 通过在 grub.conf 中的启动配置中加入如下参数即可对 grub 进行加密:

    • password --md5 +加密密码
  • 加密后的密码可以通过 grub-md5-crypt 生成
    • root 用户下输入 grub-md5-crypt ,回车后会生成一个加密后的密码,复制所有密码(包括最后的 . ,但不要复制多的空格),然后 vi /boot/grub/grub.conf ,最好是在第一行插入:password --md5 + 加密密码,保存退出。
  • 配置加密后 grub 再在引导的菜单上想修改的话就必须输入密码,正常引导是不需要的,但是你要修改内容的话就需要密码。
  • 如果 grub 密码也忘了,那就基本无法破解了,只能卸下硬盘,挂载到其他机子上,然后把硬盘的根分区启动文件夹 boot 文件所在的分区挂载到另一个机子上的 Linux 系统里面,然后把配置删除掉,然后就能进去了。其实这样还是有安全隐患的,硬盘被偷走后别人还是能进到你的系统里面去。如果想要保护数据,只能对根分区进行分区级别的加密。

十、Linux 软件管理基础:RPM、YUM

10.1、源代码形式

  • 绝大多数开源软件都是直接以源代码形式发布
  • 源代码一般会被打包成 tar.gz 的归档压缩文件
  • 源代码程序需要编译成为二进制形式之后才能够运行使用
  • 源代码基本编译流程:
    • 1- ./configure 检查编译环境、相关库文件以及配置参数并生成 makefile
    • 2- make 对源代码进行编译,生成可执行文件
    • 3- make install 将生成的可执行文件安装到当前计算机中
  • 源代码形式的软件使用起来较为麻烦,但是兼容性及可控制性较好
  • 开源软件一般都会大量使用其他开源软件的功能,所以开源软件会有大量的依赖关系(使用某软件需要先安装其他软件)

10.2、RPM

10.2.1 RPM 设计目标

  • 源代码形式的缺点:操作复杂、编译时间较长,极容易出现错误
  • 源代码形式的优点:适用所有系统,可定制
  • 为了方便使用,Erik Troan 和 Marc Ewing 开发了 RPM(Redhat Package Manager)
  • RPM 通过将源代码基于特定平台系统编译为可执行文件,并保存依赖关系,来简化开源软件的安装管理
  • RPM 设计目标如下:
    • 使用简单
    • 使用单一软件包格式文件发布( .rpm 文件)
    • 可升级
    • 追踪软件依赖关系
    • 基本信息查询
    • 软件验证功能
    • 支持多平台

10.2.2 RPM 软件包常用命名规范:

  • linuxcast-1.2.0-30.e16.i686.rpm

    • linuxcast : 软件名
    • 1.2.0-30 : 版本号,有大版本号,也有小版本号
    • e16 : 对应的系统,e16 代表红帽的 enterprise 16
    • i686 : 代表是 32位的平台,如果是64位的一般是 x86_64

10.2.3 RPM 基础命令:

  • 安装软件:rpm -i software.rpm

  • 卸载软件:rpm -e software (没有后面的 .rpm)

  • 升级形式安装:rpm -U software-new.rpm

  • rpm 支持通过 http、ftp 协议安装软件:rpm -ivh http://www.linuxcast.net/software.rpm

  • 可以加入以下参数:

    • -v 显示详细信息
    • -h 显示进度条

10.2.4 RPM 查询

  • RPM 会保存软件相关的很多信息,可通过以下命令查询:

    • rpm -qa 列出所有安装的 rpm 软件
    • rpm -qf filename 查询目标文件属于哪个 rpm 包
    • rpm -qi packagename 查询指定已安装 rpm 软件的信息
    • rpm -ql packagename 查询指定已安装 rpm 软件包含的文件
    • rpm -qip software.rpm 查询 rpm 文件的信息
    • rpm -qlp software.rpm 查询 rpm 文件包含的文件

10.2.5 RPM 验证

  • 软件在传播的过程中可能会被恶意的修改,所以为了安全起见,现在系统都加入了对软件的验证功能
  • 验证一般使用非对称加密算法,所以需要一个秘钥
  • 导入秘钥:
    • rpm --Import RPM-GPG-KEY-CentOS-6
  • 验证 rpm 文件:
    • rpm -K software.rpm
  • 验证已安装的软件:
    • rpm -V software

10.3 YUM

  • RPM 软件包形式管理软件虽然方便,但是需要手工解决软件包的依赖关系,很多时候安装一个软件需要首先安装1个或多个(有时多达上百个)其他软件,手工解决时很复杂。使用 YUM 可以解决这个问题。

10.3.1 YUM

  • YUM( Yellowdog Updater, Modified )是一个 RPM 的前端程序,主要目的是设计用来自动解决 RPM 的依赖关系问题。其特点如下:

    • 自动解决依赖关系
    • 可以对 RPM 进行分组,并基于组进行安装操作
    • 引入仓库概念,支持多个仓库
    • 配置简单

10.3.2 YUM 仓库

  • YUM 引入了仓库(repo)的概念,仓库用来存放所有现有的 rpm 软件包,当使用 yum 安装一个 rpm 软件的时候,如果存在依赖关系,会自动在仓库中查找依赖软件并安装
  • 仓库可以是本地的,也可以通过 HTTP、FTP 或 NFS 形式使用集中的、统一的网络仓库
  • yum 使用仓库保存管理 rpm 软件包,仓库的配置文件保存在 /etc/yum.repos.d/ 目录下,格式如下:
[LinuxCast]
name = This is LinuxCast.net rpm soft repo
baseurl = http://www.linuxcast.net/yum/centos/6/i386/rpms/
enabled = 1
gpgcheck = 1
  • 仓库可以使用 file、http、ftp、nfs 方式
  • yum 配置文件必须以 .repo 结尾
  • 一个配置文件内可以保存多个仓库的配置信息
  • /etc/yum.repos.d/ 目录下可以存在多个配置文件
  • 实践:查看系统安装时默认集成的 yum 仓库
    • cd /etc/yum.repos.d/
    • cat CentOS-Base.repo

10.3.3 YUM 基本命令

  • yum 管理软件的常用命令:

    • yum install software-name 安装指定软件
    • yum remove software-name 卸载指定软件
    • yum update software-name 升级指定软件
  • 实践:使用 yum 命令安装 tigervnc.x86_64
    • yum install tigervnc.x86_64

10.3.4 YUM 查询

  • 通过以下命令使用 yum 进行查询操作:

    • yum search keyword 搜索
    • yum list (all | installed | recent | updates) 列出全部、安装的、最近的、软件更新
    • yum info packagename 显示指定软件的信息
    • yum whatprovides filename 查询哪个 rpm 软件包含目标文件
  • 实践:查询所有包含 ' vnc ' 的 rpm 包
    • yum search vnc

10.3.5 创建 YUM 仓库

  • 可以通过以下方式手工创建 yum 仓库:

    • 1 将所有 rpm 文件拷贝到一个文件夹中(ls -l | wc -l 可以查看行数,也就是软件包个数)
    • 2 通过 rpm 命令手工安装 createrepo 软件
    • 3 运行命令 createrepo -v /rpm-directory
    • 4 如果有分组信息,则在运行命令的时候使用 -g 参数指定分组文件
createrepo -g /tmp/*comps.xml /rpm-directory
CentOS/RHEL 的分组信息保存在光盘 repodata/ 目录下,文件名以 comps.xml 结尾的 xml 文件
  • 创建好之后本机可以通过 file 方式直接使用,如果需要作为对外的 YUM 仓库服务器,可以通过 HTTP、FTP 或 NFS 协议共享出去

10.3.6 YUM CACHE

  • YUM 为了提高速度通常会缓存很多信息,但是有时候缓存会造成一些故障,可以通过以下命令来清除缓存:

    • yum clean all
  • 每次运行安装或查询类命令会重建 yum 缓存

Linux入门基础之 下的更多相关文章

  1. Linux入门基础教程之Linux下软件安装

    Linux入门基础教程之Linux下软件安装 一.在线安装: sudo apt-get install 即可安装 如果在安装完后无法用Tab键补全命令,可以执行: source ~/.zshrc AP ...

  2. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  3. Linux入门基础篇

    Linux入门基础篇 Linux诞生 Linux发行版本说明 Linux官方网站 Linux内核官方网站 比较有名的Linux发行版 虚拟机(Virtual Machine),一个虚拟的系统,安装在系 ...

  4. Linux入门基础之一

    Linux 入门基础 一.Linux 系统安装 安装方法网上很多,请自行百度 二.Linux 基本操作 2.1.GNOME图形界面基本操作 操作类似于Windows系统操作 打开每一个文件夹都会打开一 ...

  5. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  6. linux入门基础——linux软件管理RPM

    由于linux入门基础是基于CentOS解说的,讲的是CentOS上的软件包管理.ubuntu的软件包管理有这些:ubuntu软件包管理,包管理指南,ubuntu软件包管理. linux软件管理:RP ...

  7. Linux入门基础之 中

    五.Linux 下获取帮助 没必要记住所有东西 Linux 提供了极为详细的帮助工具及文档,一定要养成查帮助文档的习惯,可以大大减少需要记忆的东西并且提高效率 5.1.HELP 几乎所有命令都可以使用 ...

  8. linux入门基础_centos(二)--fdisk分区

    课时10 使用fdisk进行磁盘管理             fdisk是来自IBM的老牌分区工具,支持绝大多数的操作系统,几乎所有的linux的发行版本都装有fdisk,包括在linux的rescu ...

  9. linux入门基础——linux用户基础

    这篇内容是linux用户基础,相关内容见linux改动username和ubuntu改动username和主机名. 用户.组 当我们使用linux时,须要以一个用户的身份登入,一个进程也须要以一个用户 ...

随机推荐

  1. java 判断 string 转 integer 判断

    NumberUtils.isDigits("1") NumberUtils.isDigits("/") 根据返回 true false 再确定是否转换即可 需要 ...

  2. python 10 动态参数

    目录 1. 函数的动态参数 1.1 动态位置参数(*arges) 1.2 动态关键字参数 (**kwargs) 1.3 万能传参: 2. 函数的注释 3. 名称空间 4. 函数嵌套 5. 函数变量修改 ...

  3. 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  4. 原型工具介绍———墨刀以及Axure RP比较

    原型工具——墨刀以及Axure的比较 1759233 目录 一.了解背景... 1 二.下面分开介绍一下这两款工具... 1 2.1 Axure RP. 1 2.2墨刀... 6 三.比较... 8 ...

  5. Delphi - 获取文件大小

    GetFileSize获取文件大小 封装成如下函数,可以直接使用: ///函数功能:获取文件大小,单位取KB,小数自动进位 ///参数:sFilePath文件全路径 ///Result: 成功是返回文 ...

  6. poj 1797Heavy Transportation(dijkstra变形)

    题目链接:http://poj.org/problem?id=1797 题意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上 ...

  7. Linux下设置path

    1.直接用export命令: #export PATH=$PATH:自定义路径 查看是否已经设好,可用命令export查看: 2.修改profile文件: #vi /etc/profile 在里面加入 ...

  8. Increasing heap size while building the android source code on Ubuntu 15.10

    http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-c ...

  9. Django学习笔记(一):第一个django程序

    1.创建和运行 django-admin startproject xxx python manage.py runserver 2.第一个项目程序 wsgi.py中文名:python服务器网关接口. ...

  10. 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结

    细胞状态转换轨迹构建示意图(Trapnell et al. Nature Biotechnology, 2014) 在各种生物系统中,细胞都会展现出一系列的不同状态(如基因表达的动态变化等),这些状态 ...