命令行笔记
将文本按行倒序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}'