命令行笔记

5:03:00 PM 0 Comments

将文本按行倒序
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 '{$total=@F[0]+@F[1];print $total;print "\n"}' urfile

perl计算列值
perl -ane '{$total+=@F[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 预定义变量
$@
  表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%
  仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是 "bar.o","$@"就是"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 $?

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

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

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

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

"$(*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个参数
$*   这个程式的所有参数
$#   这个程式的参数个数
$@   这个程式的参数列表
$$   这个程式的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 $@
%.o : %.c
  cc -c $?
libmy.so : $(TGT)
  cc -s -shared -o $@ $(TGT)

fcitx配置
#! /bin/sh

XMODIFIERS=@im=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}'

Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.