Sed详解

1、说明
sed 一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2、用法
sed:
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

  -n, --quiet, --silent
                 取消自动打印模式空间
  -e 脚本, --expression=脚本
                 添加“脚本”到程序的运行列表
  -f 脚本文件, --file=脚本文件
                 添加“脚本文件”到程序的运行列表
  --follow-symlinks
                 直接修改文件时跟随软链接
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -l N, --line-length=N
                 指定“l”命令的换行期望长度
  --posix
                 关闭所有 GNU 扩展
  -r, --regexp-extended
                 在脚本中使用扩展正则表达式
  -s, --separate
                 将输入文件视为各个独立的文件而不是一个长的连续输入
  -u, --unbuffered
                 从输入文件读取最少的数据,更频繁的刷新输出
  -z, --null-data
                 separate lines by NUL characters
      --help     打印帮助并退出
      --version  输出版本信息并退出
示例:sed '2,5d' 
其中2,5表示2-5行(包含);d表示删除
a新增
c取代
d删除
i插入
p列印
s取代,通常搭配正则使用
举个栗子
sed '3,$d'					删除第三行到最后一行,$标示最后一行
sed '2a 这是追加的内容'		在第二行后追加内容
sed '2i 这是插入的内容'		在第二行前插入内容
sed '2c 这是替换后的内容'	替换第2~5行内容
sed '2-5p'					打印第2~5行内容
sed  -n '/root/p'			打印包含有root的行
/sbin/ifconfig eth0 |grep 'inet 地址'| sed 's/^.*地址://g' | sed 's/广播.*$//g'
等同于
/sbin/ifconfig eth0 |grep 'inet 地址'| sed -e 's/^.*地址://g' -e 's/广播.*$//g'
备注:/sbin/ifconfig eth0 |grep 'inet addr'| sed -e 's/^.*addr://g' -e 's/Bcast.*$//g'
3、实战案例-替换安卓AndroidManifest.xml配置项
echo ' '|sed -e 's#name=".*"#name="123456"#g'
备注:s后面跟着的是匹配符可以为/或者?或者#,g是全部替换

 

AWK第二课

1、工作原理
例子:
cat /etc/passwd |awk -F ‘:’ ‘BEGIN {print “name”} {print $1} END {print “Joyous”}’
说明:
awk是先执行BEGIN,然后去读文件,一行一行读取,-F指定了每行按照:分割,其中$0标示当前行,$1标示分割第一个区域,$n标示第n个区域。一直到读取完毕,最后执行END
2、正则匹配
awk -F: ‘/^root/{print $1}’ /etc/passwd
说明:搜索root开头的行打印第一个区域
3、内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
示例:
awk -F’:’ ‘{print “filename:” FILENAME “,line:” NR “,cols:” NF}’ /etc/passwd
4、printf格式化输出
awk -F ‘:’ ‘{printf(“filename:%s,linenumber:%s,columns:%s,linecontent:%s\n”,FILENAME,NR,NF,$0)}’ /etc/passwd
5、编程
定义变量可以在action块定义,语句使用;分开
awk ‘BEGIN {count=0;} {count++; print $0;} END{print “user count is “, count}’ /etc/passwd
条件语句if(){}else{}
6、函数
length(string)返回字符串的长度
index(string,find)返回子字符串在父字符串位置
tolower(string)将所有字符都转成小写
toupper(string)将所有字符都转成大写
substr(string,strat,length)截取字符串
match(string,ereg)支持正则匹配
sub(reg,rep,string)替换匹配的第一个字符序列
gsub(reg,rep,string)替换匹配的全部字符序列
split(string,arr,char)分割字符

参考:
http://www.gnu.org/software/gawk/manual/gawk.html

Ubuntu中使用alias设置命令别名

上次说到gcc编译不会链接数学库,那么需要使用gcc -lm test.c,其实默认gcc -lc test.c
我如果想省去每次带上-lm参数。那么可以使用alias命令
alias使用详解(注意这个命令有很多需要注意的地方)

用途:alias是用来给一个比较长的命令或者路径建立一个简单的名字
格式:alias 新命令=’原命令’
注意:原命令需要带上单引号,注意等号两边不能有空格,如果设置的路径是目录的话,注意最后一定要带上一个/
如果要取消的话就可以使用unalias 新命令即可取消
这样建立的命令只有在当前登录可以使用(当前的终端可以使用,重新打开新的终端不能使用),重启之后消失。
如果需长期使用,可以写入到用户目录中.bashrc文件中
如果想设定之后立即生效,就用source命令
source ~/.bashrc

PS:为了能使用services  httpd restart类似命令~~俺修改了

alias service=”
alias httpd=’/etc/init.d/apache2′
alias mysqld=’/etc/init.d/mysql’

解释:source就相当.命令。就是执行的意思,是bash内置命令~

scp命令提示bash:scp command not found

今天需要从a主机拷贝文件到b主机,两个主机都是linux的。

在a主机上使用scp命令拷贝

scp /root/1.txt root@www.0377joyous.com:/root

然后输入密码,结果提示

bash:scp command not found

难道b主机还需要什么东东?网上说scp是基于ssh的,可能是不是b上还需要ssh客户端?搜索了一通发现的确需要安装一个叫openssh-clients

安装之后再执行上面命令,问题解决

现在的遗留问题是,a主机ip是192.168.81.120,b主机是192.168.81.121,c主机是192.168.81.122

c主机读取a主机和b主机组成了一个页面index.php,而a和b主机都不稳定,容易不定时出现宕机~~这样就影响了c主机正常显示。初步想法是:c主机定时生成本机静态页面~~这样就不怕a和b宕机,即使c生成静态页面的时候a或者b宕机了,那就用原来数据补充空白~~~

您有什么好的想法呢?

Vi编辑器使用教程

编辑器分为三种模式:(命令行模式、末行模式、插入模式)

  1. 命令行模式

进入插入模式
i:从光标当前位置开始输入
a:从目前光标所在位置的下一个位置开始输入
o:在光标所在位置的下一行首输入
I:光标所在行首插入
A:行末插入
O:在上一行插入
s:删除光标位置的一个字符然后插入
S:删除光标所在行,然后插入
插入模式到命令行
按下ESC键就可以了

移动光标(听说很正规的Linux都这样用)

数字“0”:光标移动到所在行的行首
”G“:移动到文本的最后一行
$:移动到行尾
^:移动到行首
w:光标跳到下个字的开头

删除文字

x:删除光标所在位置一个字符
nx:删除光标之后的n个字符
X:删除光标之前的字符
nX:删除之前n个字符
dd:删除光标所在行
ndd:删除光标之后n行

Continue reading