Archive for ‘Unix/Linux’ Category

May 14, 2010

简述

  sed是Linux环境下的一个文本流、行编辑器,十分强大,这里贴一些常用的单行脚本,脚本最初来源于此,基本未做改动。另外一个强大的文本处理工具就是awk,对于这两个工具,个人觉得,根据个人选择其一就够用了,我自己就喜欢sed多一点。Bones在这里用awk对下面的各个sed命令行做了相应的替代。
  推荐一本关于sed和awk的书《sed & awk》,作者Dale Dougberty, Arnold Robbins。中文版在网上已经买不到了,china-pub倒是有,不过是原版的一般人承受不起那个价位。幸好这本书的作者提供免费的电子版,在网上应该可以搜的到。

sed单行命令快速参考

文本间隔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 在每一行后面增加一空行
 sed G
 
 # 将原来的所有空行删除并在每一行后面增加一空行。
 # 这样在输出的文本中每一行后面将有且只有一空行。
 sed '/^$/d;G'
 
 # 在每一行后面增加两行空行
 sed 'G;G'
 
 # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
 sed 'n;d'
 
 # 在匹配式样“regex”的行之前插入一空行
 sed '/regex/{x;p;x;}'
 
 # 在匹配式样“regex”的行之后插入一空行
 sed '/regex/G'
 
 # 在匹配式样“regex”的行之前和之后各插入一空行
 sed '/regex/{x;p;x;G;}'
Tags: . 532 views
May 11, 2010

  俺学习和使用Shell过程中积累的一些东西,希望对某些看官有用。另,本人使用bash环境。

Shell预设环境变量

环境变量 说明
$HOME 当前用户主目录
$PATH 冒号分割的用来搜索命令的目录的几何
$PS1 命令提示符,例如[\u@\h/\W$]给出了user@host/folder $这样的提示符
$PS2 二级提示符,通常仅仅包含一个>
$IFS 输入分割域,通常为空白符,即空格、制表符、回车
$0 shell脚本的文件名
$# 调用本脚本时提供的参数个数
$$ shell脚本的进程号
$! 后台进程的进程号
$? 上一个进程的退出状态
$1, $2, ……, $n 脚本的参数,n超过9时需要用${n}
$* 包含了所有的参数,各参数以$IFS分割
$@ 类似$*,但当$IFS为空时,各参数不会到一块儿,”$*”和”$@“的扩展不同
Tags: . 187 views
April 28, 2010

dd简介

  dd是一个比较古老的命令,早在Unix诞生之时就来到人间,成为每一个Hacker的必备工具。它是干什么的?对此,man大叔有话说。dd是一个拷贝文件的命令,同时它会根据特定选项对文件进行转换和格式化。主要的选项有:

  • ibs=BYTES,一次从输入文件中拷贝的字节数(BLOCKS)
  • if=FILE ,指定输入文件,缺省为stdin
  • obs=BYTES, 一次从输出文件中拷贝的字节数
  • of=FILE,指定输出文件,不会截断文件,缺省为stdout
  • bs=BYTES,同时指定ibs=BYTES, obs=BYTES
  • cbs=BYTES ,每次转换的字节数
  • conv=KEYWORDS[,KEYWORDS],根据KEYWORDS指定的规则(多个规则以逗号,分隔)对文件进行转换
  • count=BLOCKS,指定从输入文件中要拷贝的BLOCKS数
  • seek=BLOCKS,从输出文件开头处跳过指定的BLOCKS数
  • skip=BLOCKS ,从输出文件开头处跳过指定的BLOCKS数
Tags: . 336 views
April 15, 2010

  利用alias,可以使我们更快的输入一些常用的但比较长的命令,这当然也适用于cd命令。为了不用每次有执行alias定义别名,我们应该把这些别名放入shell的配置文件中,比如.bashrc和.bash_profile,当shell(这里假定是bash)启动时会自动执行其中的命令。下面列出我常用的一些别名,仅供参考:

1
2
3
4
5
6
7
8
9
alias ll='ls -lh'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias -- -='cd -' # --指示命令选项已经结束,下面全都是参数,否则=会被当作选项
alias bl='bc -l' # calculator with compute library.
bind 'set completion-ignore-case on' # 使shell的Tab自动补全忽略字母的大小写
Tags: . 85 views
April 11, 2010

  去年写的,后来整理文章时”丢”了,现在把它贴回来。

  操作系统为每一个进程维护着一个虚拟的地址空间,这个地址空间的大小通常取决于系统的地址线数目,比如在32位系统中,虚拟地址空间的返回就是0×00000000~0xFFFFFFFF,大小共4G。通常操作系统会划分出一部分来专门供内核使用,而不允许用户进程直接访问。Linux内核占用4G中高地址的1G,即0XC0000000~0XFFFFFFFF,windows内核通常占用高地址的2G空间,但也可配置成1G。进程的代码、数据以及共享库等资源终究是要放在物理内存中才能被访问的,操作系统在建立用户进程时,会为其建立各自独立的虚拟地址空间,然后将各自的数据段、代码段、BSS段等映射到这个地址空间,并为其初始化堆、栈等必须的资源。另外,操作系统还将虚拟空间和物理空间都划分成大小相等的页,把进程数据所在虚拟地址空间的各个虚拟页面映射到其真正被加载的物理页面,这种映射是全相联方式的,即任何一个虚页可以被映射到任何一个实页。

Tags: ,. 416 views
March 28, 2010

一个演示脚本

  下面的这个脚本修改自《A Practical Guide to Linux Command, Editions, and Shell Programming》。不提供参数时,它将标准输入输出到标准输出;提供一个文件名参数时,将该文件输出到标准输出;提供两个文件名参数时,它将提一个文件复制到第二个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/sh
 
case $# in
    0)
        exec 3<&0 4>&1
        ;;
    1)
        exec 3<$1 4<&1
        ;;
    2)
        exec 3<$1 4>$2
        ;;
    *)
        echo "Usage: `basename $0` [source [dest]]"
        exit 1
        ;;
esac
cat <&3 >&4
exec 3<&- 4>&-
exit 0
Tags: . 455 views
March 22, 2010

  当然,我不会一行行的粘贴复制。有一个叫做的tac的命令似乎能完成这个工作,但它只能将整个文件反转。更好的选择是sed:

sed  -e '4,240G;3,240h;3,239d' sample.js > reverse.js

  这样就搞定了!
  简单解释一下。sed内部维护着两个缓冲区,模式缓冲和保留缓冲。通常,sed每每从文件读入一行就放入模式缓冲,由-e选项指定的各个命令依次处理这个缓冲内的文本,所有命令都执行完后,sed就把模式缓冲的内容输出的标准输出(如果没有指定-n选项的话)。保留缓冲是一个由用户显式使用的缓冲区。-e ’4,240G;3,240h;3,239d’中,G将保留缓冲取的内容附加到(append)模式缓冲,h将模式缓冲复制(copy)到保留缓冲,d将模式缓冲区的内容清除,各个命令前由逗号分割的数字指名了后面的命令在哪些行上执行,各命令由分号进行分割。
  具体地:

  1. 1、2行被读入(模式缓冲)时,-e列出各命令都没有动作,直接输出;
  2. 第3行被读入时,G不执行,h将该行复制到保留缓冲,d将模式缓冲清除,没有输出;
  3. 第4行被读入模式缓冲,然后G将保留缓冲的内容(第三行)附加到模式缓冲,h又将模式缓冲复制到保留缓冲,d又将模式缓冲清除,没有输出;
  4. 重复3,直到第239行;
  5. 第240行被读入,G将第239到3行附加到第240行后面,h又将其复制到保留缓冲,d不执行,240到3行被输出;
  6. 241到243行被原样输出,至此,3~240行被反转
Tags: ,,. 201 views
March 21, 2010

更新:

  上面的脚本有一个问题,没播放一首歌曲mplayer都需要退出一次,耗费资源不说,还不能回放上一首。为了更方面的使用mplayer自身的功能和快捷键,我更新了上面的脚本,为mplayer生成了一个播放列表,然后用命令mplayer -playlist list.txt来播放。这样利用mplayer的快捷键,我们就可以很好的控制这个播放器了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
 
#当脚本退出或被中断(Ctrl+C)时,删除曲目文件
trap 'rm -f list.txt;exit 1' INT
trap 'rm -f list.txt' EXIT
#连接ftp并进入指定目录
lftp "$1" <<!TOC!
cd pub/"$2"/
ls > list.txt
quit
!TOC!
#删除非mp3文件名,得到mp3文件名
sed -i -e '/mp3/!d' -e 's/^.\{56\}//g' list.txt
sed -i "s#^\(.*\)#ftp://$1/pub/$2/\1#g" list.txt
mplayer -playlist list.txt  >/dev/null 2>&1
Tags: ,. 88 views
March 19, 2010

在LinuxToy上看到的,实在精彩!

最酷的10个Linux单行命令
命令 描述
sudo !! 以 root 帐户执行上一条命令。
python -m SimpleHTTPServer 利用 Python 搭建Web 服务器,可通过 http://$HOSTNAME:8000 访问。
:w !sudo tee % 在 Vim 中无需权限保存编辑的文件。
cd - 更改到上一次访问的目录。
^foo^bar 将上一条命令中的 foo 替换为 bar,并执行。
cp filename{,.bak} 快速备份或复制文件。
mtr google.com traceroute + ping。
!whatever:p 搜索命令历史,但不执行。
$ssh-copy-id user@host 将 ssh keys 复制到 user@host 以启用无密码 SSH 登录。
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg 把 trnux 桌面录制为视频。

但是,有两条命令着实无法理解,Vim保存文件的和备份的。哪位解释一下?

Tags: . 102 views
March 17, 2010

Linux下的硬盘及分区

  Linux系统可以挂载多个不同接口类型的磁盘(disk),每一个磁盘又可以分成若干个分区(Partition),每个分区又可以拥有自己的文件系统类型(FileSystem)。Linux对于磁盘和分区又自己的一套标记方法。

硬盘和分区的区分

  第一个SCSI(Small Computer System Interface)磁盘记为/dev/sda,第二个SCSI磁盘记为/dev/sdb;第一个SATA磁盘记为/dev/hda,第二个为/dev/hdb,以此类推。Linux系统中,每一个磁盘的各个分区编号是从1开始的,例如,第一个SCSI磁盘的第一个分区为/dev/sda1,第二分区为/dev/sda2。

分区结构

  一块没有分过区的硬盘(RAW)就像一块荒蛮的土地,是没有有意义数据的。分好区的硬盘就会具有一定的结构性。分区就是将硬盘分为一定的区域,便于使用。 一块硬盘最多可以分四个区(主分区)。无论硬盘分多少个区,它的最前面都有一个引导扇区(主引导记录MBR)。
  主引导记录由三部分组成:开始是446B的操作系统引导代码,紧接着是64byte的主分区表。主分区表最多记录四个主分区的分区信息,主要包括该分区的起始/结束柱面、大小、类型等信息。每个分区记录占用16B。分区就是修改分区表,它不影响硬盘上的存储的数据。最后是2字节的结束标志0x55AA(01010101 10101010)。

Tags: ,. 321 views
Page 3 of 9123456789