天天看点

命令笔记

将文本按行倒序

tac urfile

sed '1!G;h;$!d' urfile

awk计算行值

awk '{print $1+$2}' urfile

awk计算列值

awk 'BEGIN{total=0}{total+=$1}END{print total}' urfile

perl计算行值

perl -ane '{[email protected][0][email protected][1];print $total;print "/n"}' urfile

perl计算列值

perl -ane '{[email protected][0];}END{print $total;print "/n"}' urfile

删除包含aaa但不包含bbb的行

sed '/aaa/{/bbb/!d}' urfile

文件列转行

设urfile文件有如下文本

aaa

bbb

ccc

ddd

现要得到 

aaa bbb ccc ddd

方法如下

xargs < urfile

awk '{printf "%s ", $0}END{print ""}' urfile

paste -sd' ' urfile

echo `cat urfile`

perl -00 -pe 's{/n}{ }gs' urfile

sed '{:1;N;s//n/ /g;b 1}' urfile

文本行列倒置

#!/bin/sh

#ScriptName:rotate

[ $# -ne 1 ] && exit 1

if [ ! -s $1 ]

then

    echo "Usage:rotate datafile"

    exit 1

fi

row=`sed -n '$=' $1`

col=`awk 'NR==1{print NF}' $1`

awk -v row=$row -v col=$col '{for(i=1;i<=NF;i++)a[NR"-"i]=$i} END{ for(i=1;i<=col;i++){ for(j=1;j<=row;j++) printf("%s ",a[j"-"i]);printf("/n") } }' $1

文件名取值

#FILE=/dir1/dir2/dir3/my.file.txt

#echo $FILE

/dir1/dir2/dir3/my.file.txt

#echo ${FILE#*/}

dir1/dir2/dir3/my.file.txt

#echo ${FILE##*/}

my.file.txt

#echo ${FILE#*.}

file.txt

#echo ${FILE##*.}

txt

#echo ${FILE/*}

/dir1/dir2/dir3

#echo ${FILE%%/*}

#echo ${FILE%.*}

/dir1/dir2/dir3/my.file

#echo ${FILE%%.*}

/dir1/dir2/dir3/my

删除第二次匹配create到末尾的行

sed '0,/create/b;//Q' urfile

合并两个文件

(sort -m file1;sort -m file2) > file3

查看程序用到哪些库

ldd program

静态库操作

ar rc libmy.a 创建一个库

ar rs libmy.a 1.o 向库添加模块

ar t libmy.a 查看库中模块

at d libmy.a 1.o 删除库中模块

查看端口25

lsof -i:25 

文件格式转换

sed -e 's/$//r/' myunix.txt > mydos.txt

sed -e 's/.$//' mydos.txt > myunix.txt

查看出现至少两次的行

grep '4/{2,/}' urfile

grep '8/{2,6/}3' urfile

查找可用源

apt-spy -d testing -a Asia -o sources.out

make 预定义变量

[email protected]

  表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"[email protected]"就是匹配于目标中模式定义的集合。

$%

  仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是 "bar.o","[email protected]"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

$<

  依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?

  所有比目标新的依赖目标的集合。以空格分隔。

$^

  所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

$+

  这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

$* 

  这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以," $*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。

当你希望只对更新过的依赖文件进行操作时,"$?"在显式规则中很有用,例如,假设有一个函数库文件叫"lib",其由其它几个object文件更新。那么把object文件打包的比较有效率的Makefile规则是:

  lib : foo.o bar.o lose.o win.o

        ar r lib $?

在上述所列出来的自动量变量中。四个变量([email protected]、$<、$%、$*)在扩展时只会有一个文件,而另三个的值是一个文件列表。这七个自动化变量还可以取得文件的目录名或是在当前目录下的符合模式的文件名,只需要搭配上"D"或"F"字样。这是GNU make中老版本的特性,在新版本中,我们使用函数"dir"或"notdir"就可以做到了。"D"的含义就是Directory,就是目录,"F"的含义就是File,就是文件。

下面是对于上面的七个变量分别加上"D"或是"F"的含义:

$(@D)

  表示"[email protected]"的目录部分(不以斜杠作为结尾),如果"[email protected]"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"[email protected]"中没有包含斜杠的话,其值就是"."(当前目录)。

$(@F)

  表示"[email protected]"的文件部分,如果"[email protected]"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相当于函数"$(notdir [email protected])"。

"$(*D)"

"$(*F)"

  和上面所述的同理,也是取文件的目录部分和文件部分。对于上面的那个例子,"$(*D)"返回"dir",而"$(*F)"返回"foo"

"$(%D)"

"$(%F)"

  分别表示了函数包文件成员的目录部分和文件部分。这对于形同"archive(member)"形式的目标中的"member"中包含了不同的目录很有用。

"$(<D)"

"$(<F)"

  分别表示依赖文件的目录部分和文件部分。

"$(^D)"

"$(^F)"

  分别表示所有依赖文件的目录部分和文件部分。(无相同的)

"$(+D)"

"$(+F)"

  分别表示所有依赖文件的目录部分和文件部分。(可以有相同的)

"$(?D)"

"$(?F)"

  分别表示被更新的依赖文件的目录部分和文件部分。

最后想提醒一下的是,对于"$<",为了避免产生不必要的麻烦,我们最好给$后面的那个特定字符都加上圆括号,比如,"$(<)"就要比"$<"要好一些。

还得要注意的是,这些变量只使用在规则的命令中,而且一般都是"显式规则"和"静态模式规则"(参见前面"书写规则"一章)。其在隐含规则中并没有意义

关于命令的变量。

AR 

  函数库打包程序。默认命令是“ar”。 

AS 

  汇编语言编译程序。默认命令是“as”。

CC 

  C语言编译程序。默认命令是“cc”。

CXX 

  C++语言编译程序。默认命令是“g++”。

CO 

  从 RCS文件中扩展文件程序。默认命令是“co”。

CPP 

  C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”。

FC 

  Fortran 和 Ratfor 的编译器和预处理程序。默认命令是“f77”。

GET 

  从SCCS文件中扩展文件的程序。默认命令是“get”。 

LEX 

  Lex方法分析器程序(针对于C或Ratfor)。默认命令是“lex”。

PC 

  Pascal语言编译程序。默认命令是“pc”。

YACC 

  Yacc文法分析器(针对于C程序)。默认命令是“yacc”。

YACCR 

  Yacc文法分析器(针对于Ratfor程序)。默认命令是“yacc –r”。

MAKEINFO 

  转换Texinfo源文件(.texi)到Info文件程序。默认命令是“makeinfo”。

TEX 

  从TeX源文件创建TeX DVI文件的程序。默认命令是“tex”。

TEXI2DVI 

  从Texinfo源文件创建军TeX DVI 文件的程序。默认命令是“texi2dvi”。

WEAVE 

  转换Web到TeX的程序。默认命令是“weave”。

CWEAVE 

  转换C Web 到 TeX的程序。默认命令是“cweave”。

TANGLE 

  转换Web到Pascal语言的程序。默认命令是“tangle”。

CTANGLE 

  转换C Web 到 C。默认命令是“ctangle”。

RM 

  删除文件命令。默认命令是“rm –f”。

关于命令参数的变量

下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。

ARFLAGS 

  函数库打包程序AR命令的参数。默认值是“rv”。

ASFLAGS 

  汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。 

CFLAGS 

  C语言编译器参数。

CXXFLAGS 

  C++语言编译器参数。

COFLAGS 

  RCS命令参数。 

CPPFLAGS 

  C预处理器参数。( C 和 Fortran 编译器也会用到)。

FFLAGS 

  Fortran语言编译器参数。

GFLAGS 

  SCCS “get”程序参数。

LDFLAGS 

  链接器参数。(如:“ld”)

LFLAGS 

  Lex文法分析器参数。

PFLAGS 

  Pascal语言编译器参数。

RFLAGS 

  Ratfor 程序的Fortran 编译器参数。

YFLAGS 

  Yacc文法分析器参数。

脚本特殊变量

$0   脚本名

$n   脚本的第n个参数

$*   这个程式的所有参数

$#   这个程式的参数个数

[email protected]   这个程式的参数列表

$$   这个程式的PID

$!   执行上一个背景指令的PID

$?   执行上一个指令的返回值

ipcs

-m   shared memory segments

-q   message queues

-s   semaphore arrays

-a   all (this is the default)

...

常用debian命令

apt-get update 更新源列表

apt-get install pkg 安装软件包

apt-get install --reinstall pkg 重新安装软件包

apt-get install --download-only --reinstall pkg 下载软件包

apt-get build-dep pkg 安装依赖包

apt-get remove pkg 先移除软件包

apt-get remove --purge pkg 彻底移除软件包

apt-cache search pkg 查找软件包

apt-cache search pkg --names-only 查找软件包(仅名称)

apt-cache show pkg 显示包信息

dpkg -I pkg.deb 显示包信息

dpkg -i pkg.deb 安装包

dpkg -c pkg.dev 查看包内容

dpkg -L pkg 查看包(已安装)内容

dpkg -s pkg 查看包(已安装)信息

dpkg -S xxx 相看xxx所属软件包

dpkg -x pkg.deb cc 将包解到cc目录中

dpkg -P pkg 清除软件包

dpkg -r pkg 移除软件包

apt-file update 更新源列表

apt-file search xxx查找源中xxx所属软件包

转换编码gb18030 to utf-8

iconv -f gb18030 -t utf-8 -o zh_CN.po pkg.po

wget下载命令

-c 断点续传

-r 递归下载

-nd 不递归创建目录

-np 不搜索上一层目录

-k 脱机浏览时用此项

-L 递归时不进入其它主机

-p 下载网页所需的所有文件

-A 指定要下载文件样式列表

-i 后跟一个文件指明要下载的URL

如:

wget -t0 -c -nH -np -b -m localdir URL -o wget.log

cpio文件制作

find . | cpio -H newc -o > ../file

cpio文件解开

cat file| cpio -i

分区相关(设硬盘80G,独立分区,不针对所有人,看贴者勿效仿)

/ 1~2 G

/boot ~300M

/usr ~15G

/var ~10G

/swap ~2*memory

/home rest

makefile小模板

all : libmy.so

SRC : print.c

TGT : $(SRC:.c=.o)

$(SRC): print.h

  @touch [email protected]

%.o : %.c

  cc -c $?

libmy.so : $(TGT)

  cc -s -shared -o [email protected] $(TGT)

fcitx配置

#! /bin/sh

[email protected]=fcitx

GTK_IM_MODULE=fcitx

export XMODIFIERS GTK_IM_MODULE

if [ -x "/usr/bin/fcitx" ]; then

    /usr/bin/fcitx &

fi

scim配置

#! /bin/sh

export XMODIFIERS="@im=SCIM"

export GTK_IM_MODULE="scim"

export XIM_PROGRAM="scim -d"

#export QT_IM_MODULE="scim"

# -- help --

# modify LANG=zh_CN.UTF-8 in /etc/environment

mkiso

mkisofs -o mini.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table tree-of-root

makefile辅记

设当前目录有文件help.en.html makefile

makefile内容如下

NAME = $(wildcard *.html)

BASENAME = $(basename $(wildcard *.html))

SUFFIXNAME = $(addsuffix .c, $(basename $(wildcard *.html)))

PRENAME = $(addprefix install/, $(wildcard *.html))

SUBNAME = $(subst .,,$(basename $(wildcard *.html)))

all :

    @echo $(NAME)

    @echo $(BASENAME)

    @echo $(SUFFIXNAME)

    @echo $(PRENAME)

    @echo $(SUBNAME)

make时结果如下

help.en.html

help.en

help.en.c

install/help.en.html

helpen

ldconfig

可以将路径添加到/etc/ld.so.conf

再执行ldconfig

或执行ldconfig pathdir

qemu-img

qemu-img create hd.img 3G

qemu

qemu -boot d -cdrom mini.iso -hda hd.img

dpkg-scanpackages

dpkg-scanpackages [-u] . /dev/null | gzip > Packages.gz

灭掉U盘灯

umount U盘挂载目录

eject /dev/sda

mkisofs

mkisofs -o mini.iso -r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat ./mm

wget

wget -t0 -c -nH -np -b -m link-of-download-file

find文本

find . -type f|perl -e 'while(<>){s//n//;if(-T){print $_."/n"}}'

find . -type f|perl -e 'while(<>){s//n//;if(!-B){print $_."/n"}}'

将匹配的行与上一行合并为一行

N;//npattern/{s//n/ /;p;d};P;D;

rsync同步

同步src与dest目录

rsync -avz src dest

同步src与dest,并将dest中多余的文件删除

rsync -avz --delete src dest

awk输出中间的连续列(如2-4列)

awk 'BEGIN{i=2;ORS=""}{ while( i<=4 ) {print $i " " ;i++} print "/n";i=2}'

继续阅读