1.在Vim中可以直接查看文件编码
:set fileencoding
即可显示文件编码格式。
如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在
~/.vimrc 文件中添加以下内容:
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。
Mem: 8164340 8122280 42060 0 46856 1581420
-/+ buffers/cache: 6494004 1670336
Swap: 1024056 233692 790364
Mem: 8164340 8122280 42060 0 46856 1581420
-/+ buffers/cache: 6494004 1670336
Swap: 1024056 233692 790364
$channel_id = $sess->get( 'cms', 'cms_top_ch' );
$password = $sess->get('cms', 'cas_user_password');
$channel_name = $sess->get( 'cms', 'cms_top_ch_spell' );
$logger->error($err_msg,__FILE__,__LINE__);
//打印调试
$post_data = array(
//all message parameter here
'priority' => 3, //默认是3,也可以改成其他优先级
'businessCode' => 55,
//短信ID,待填
//'msgId' =>
'msgDest' => $potentate_num,
'msgContent' => '发布过程出错,文件未能全部发布成功!',
'userName' => 'vscms',
'password' => 'dbef9d4b65dd43b8101a2831fe17bb2a' //常规md5加密,32位MD5小写
//'password' => 'vscms&*()'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $smss_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$response= curl_exec($ch);
if (curl_errno($ch) != 0) {
$err_msg = curl_error($ch);
curl_close($ch);
}
curl_close($ch);
在页头使用date_default_timezone_set()设置我的默认时区为北京时间
date_default_timezone_set('PRC');
echo date('Y-m-d H:i:s');
时间和服务器当前时间一样了
linux 如何显示一个文件的某几行(中间几行)
【一】从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
*注意两种方法的顺序
分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
【三】用sed命令
linux 如何显示一个文件的某几行(中间几行)
【一】从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
*注意两种方法的顺序
分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
【三】用sed命令
UltraEdit32,查找功能(CTRL + F),高级(老的版本无需点高级),勾选中"列出包含字符串的所有行/List Lines Containing String",然后查找,找到后会有一个列表框,右边有复制到剪切板的按钮…… 我这儿没有你说的只列出一行的问题。 修改: 我明白你的意思了,这个仍然可以用UltraEdit来解决,只要用好正则表达式就行: 查找时,勾选“正则表达式”,引擎使用“UltraEdit”,搜索的字符输入: User=^[HC2^]?+[^r^p^n]?+[^r^p^n] 上面的是匹配多出一行来的,我用你补充的数据测试是可以的。如果再要多几行,可以多加几个 ?+[^r^p^n] 其中[^r^p^n]是匹配一个换行符,但因为不知道你的文件具体是哪种方式的换行,所以用了三种供任意匹配。
启动分屏
1.使用大写O参数进行垂直分屏
$ vim -On file1 file2 ...
2.使用小写o参数进行水平分屏
$ vim -on file1 file2 ...
注: n是数字,表示分屏的数量
关闭分屏
1.关闭当前窗口
ctrl+w c
2.关闭当前窗口,如果只剩最后一个,则退出vim
关闭分屏
1.关闭当前窗口
ctrl+w c
2.关闭当前窗口,如果只剩最后一个,则退出vim
ctrl+w q
编辑中分屏
1.上下分割当前打开的文件
ctrl+w s
2.上下分割,并打开一个新的文件
:sp filename
3.左右分割当前打开的文件
ctrl+w v
4.左右分割,并打开一个新的文件
:vsp filename
分屏编辑中光标的移动
vi中的光标键是h,j,k,l,要在各个屏之间切换,只需要先按一下ctrl+w
1.把光标移动到上边的屏
ctrl+w k
2.把光标移动到下边的屏
ctrl+w j
3.把光标移动到右边的屏
ctrl+w l
4.把光标移动到左边的屏
ctrl+w h
5.把光标移动到下一个的屏
ctrl+w w
移动分屏
1.向上移动
ctrl+w K
2.向下移动
ctrl+w J
3.向右移动
ctrl+w L
4.向左移动
ctrl+w H
屏幕尺寸
1.增加高度
ctrl+w +
2.减少高度
ctrl+w -
3.让所有屏的高度一致
cms线上机器部署:
tc-cms-db00.tc (cmsui)
tc-cms-db01.tc (cmsdeliver)
ai-cms-hn00.ai01 (后端定时定点脚本:updatetask_shell_new)
ai-cms-hn01.ai01 (cmspmcenter)
起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要2秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢。
分析:
1、首先,在页面访问变慢情况发生时,使用 top 命令查看了服务器的负载情况,发现负载并不高,初步估计不是程序的问题。
2、然后,查看了线程中的 httpd 的数量, ps -aux | grep httpd | wc -l 发现,线程数已经达到了 apache 设置的最大值。由此断定是网站访问人数过多造成了访问过慢。
3、为了验证,查看了连接数和当前的连接数,分别是
netstat -ant | grep $ip:80 | wc -l
netstat -ant | grep $ip:80 | grep EST | wc -l
发现果然,连接数特别多,远远超过我们的估计值。
[rd@tc-cms-db01.tc.baidu.com cmsdeliver]$ grep taskNum log/cmsdeliver.log
NOTICE: 10-28 16:01:48: cmsdeliver. * 182895225568 taskNum=407 get_task_from_db 445
DEBUG: 10-28 16:01:48: cmsdeliver. * 182895225568 Total jobCount=390 taskNum=407
NOTICE: 10-28 16:06:14: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:06:14: cmsdeliver. * 182895225568 Total jobCount=500 taskNum=500
NOTICE: 10-28 16:11:20: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:11:20: cmsdeliver. * 182895225568 Total jobCount=500 taskNum=500
NOTICE: 10-28 16:16:31: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:16:31: cmsdeliver. * 182895225568 Total jobCount=500 taskNum=500
NOTICE: 10-28 16:21:23: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:21:23: cmsdeliver. * 182895225568 Total jobCount=500 taskNum=500
NOTICE: 10-28 16:26:25: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:26:25: cmsdeliver. * 182895225568 Total jobCount=500 taskNum=500
NOTICE: 10-28 16:31:23: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:31:23: cmsdeliver. * 182895225568 Total jobCount=499 taskNum=500
NOTICE: 10-28 16:36:18: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:36:18: cmsdeliver. * 182895225568 Total jobCount=474 taskNum=500
NOTICE: 10-28 16:37:29: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:37:29: cmsdeliver. * 182895225568 Total jobCount=242 taskNum=500
NOTICE: 10-28 16:38:10: cmsdeliver. * 182895225568 taskNum=500 get_task_from_db 445
DEBUG: 10-28 16:38:10: cmsdeliver. * 182895225568 Total jobCount=205 taskNum=500
注意 jobCount
14、函数的传值和传指针
————————————
向函数传参数时,一般而言,传入非const的指针时,就表示,在函数中要修改这个指针把指内存中的数据。如果是传值,那么无论在函数内部怎么修改这个值,也影响不到传过来的值,因为传值是只内存拷贝。
什么?你说这个特性你明白了,好吧,让我们看看下面的这个例程:
void
GetVersion(char* pStr)
{
pStr = malloc(10);
strcpy ( pStr, "2.0" );
}
main()
{
char* ver = NULL;
GetVersion ( ver );
...
...
free ( ver );
}
30、请sizeof类型而不是变量
—————————————
许多程序员在使用sizeof中,喜欢sizeof变量名,例如:
int score[100];
char filename[20];
struct UserInfo usr[100];
在sizeof这三个的变量名时,都会返回正确的结果,于是许多程序员就开始sizeof变量名。这个习惯很虽然没有什么不好,但我还是建议sizeof类型。
我看到过这个的程序:
pScore = (int*) malloc( SUBJECT_CNT );
memset( pScore, 0, sizeof(pScore) );
...
此时,sizeof(pScore)返回的就是4(指针的长度),不会是整个数组,于是,memset就不能对这块内存进行初始化。为了程序的易读和易维护,我强烈建议使用类型而不是变量,如:
对于score: sizeof(int) * 100 /* 100个int */
对于filename: sizeof(char) * 20 /* 20个char */
对于usr: sizeof(struct UserInfo) * 100 /* 100个UserInfo */
这样的代码是不是很易读?一眼看上去就知道什么意思了。
另外一点,sizeof一般用于分配内存,这个特性特别在多维数组时,就能体现出其优点了。如,给一个字符串数组分配内存,
/*
* 分配一个有20个字符串,
* 每个字符串长100的内存
*/
char* *p;
/*
* 错误的分配方法
*/
p = (char**)calloc( 20*100, sizeof(char) );
/*
* 正确的分配方法
*/
p = (char**) calloc ( 20, sizeof(char*) );
for ( i=0; i<20; i++){
/*p = (char*) calloc ( 100, sizeof(char) );*/
p[i] = (char*) calloc ( 100, sizeof(char) );
}
(注:上述语句被注释掉的是原来的,是错误的,由dasherest朋友指正,谢谢)
为了代码的易读,省去了一些判断,请注意这两种分配的方法,有本质上的差别。
10.23.249.116 服役中的imis机器
10.46.122.52 备用的imis机器
一些可能你不知道的shell用法和脚本,简单&强大!
!$
!$是一个特殊的环境变量,它代表了上一个命令的最后一个字符串。如:你可能会这样:
$mkdir mydir
$mv mydir yourdir
$cd yourdir
可以改成:
$mkdir mydir
$mv !$ yourdir
$cd !$
sudo !!
以root的身份执行上一条命令 。
场景举例:比如Ubuntu里用apt-get
安装软件包的时候是需要root身份的,我们经常会忘记在apt-get
前加sudo
。每次不得不加上sudo
再重新键入这行命令,这时可以很方便的用sudo !!
完事。
(陈皓注:在shell下,有时候你会输入很长的命令,你可以使用!xxx来重复最近的一次命令,比如,你以前输入过,vi /where/the/file/is, 下次你可以使用 !vi 重得上次最近一次的vi命令。)
cd –
回到上一次的目录 。
场景举例:当前目录为/home/a
,用cd ../b
切换到/home/b
。这时可以通过反复执行cd –
命令在/home/a
和/home/b
之间来回方便的切换。
(陈皓注:cd ~ 是回到自己的Home目录,cd ~user,是进入某个用户的Home目录)
- ‘ALT+.’ or ‘<ESC> .’
热建alt+. 或 esc+. 可以把上次命令行的参数给重复出来。 - --只试验成功了ESC+.
^old^new
替换前一条命令里的部分字符串。
场景:echo "wanderful"
,其实是想输出echo "wonderful"
。只需要^a^o
就行了,对很长的命令的错误拼写有很大的帮助。(陈皓注:也可以使用 !!:gs/old/new)
- du -s * | sort -n | tail
列出当前目录里最大的10个文件。
- mtr coolshell.cn
mtr命令比traceroute要好。 - --没试验成功
- 在命令行前加空格,该命令不会进入history里。
- --没试验成功
- echo “ls -l” | at midnight
在某个时间运行某个命令。(这个命令相当有用!!!但是时间点怎么写?)
- curl -u user:pass -d status=”Tweeting from the shell” http://twitter.com/statuses/update.xml
命令行的方式更新twitter。
- curl -u username –silent “https://mail.google.com/mail/feed/atom” | perl -ne ‘print “\t” if /<name>/; print “$2\n” if /<(title|name)>(.*)<\/\1>/;’
检查你的gmail未读邮件
- ps aux | sort -nk +4 | tail
列出头十个最耗内存的进程
man ascii
显示ascii码表。
场景:忘记ascii码表的时候还需要google么?尤其在天朝网络如此“顺畅”的情况下,就更麻烦在GWF多应用一次规则了,直接用本地的man ascii
吧。
ctrl-x e
快速启动你的默认编辑器(由变量$EDITOR设置)。- --没试验成功
netstat –tlnp
列出本机进程监听的端口号。(陈皓注:netstat -anop 可以显示侦听在这个端口号的进程)
tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'
当file.log里出现Finished: SUCCESS时候就退出tail,这个命令用于实时监控并过滤log是否出现了某条记录。- --待实验
ssh user@server bash < /path/to/local/script.sh
在远程机器上运行一段脚本。这条命令最大的好处就是不用把脚本拷到远程机器上。
- ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
比较一个远程文件和一个本地文件 - --diff改成vimdiff应该也一样
screen -d -m -S some_name ping my_router
后台运行一段不终止的程序,并可以随时查看它的状态。-d -m
参数启动“分离”模式,-S
指定了一个session的标识。可以通过-R
命令来重新“挂载”一个标识的session。更多细节请参考screen用法man screen
。
wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com
下载整个www.example.com网站。(注:别太过分,大部分网站都有防爬功能了:))
curl ifconfig.me
当你的机器在内网的时候,可以通过这个命令查看外网的IP。
- convert input.png -gravity NorthWest -background transparent -extent 720×200 output.png
改一下图片的大小尺寸
lsof –i
实时查看本机网络服务的活动状态。
- vim scp://username@host//path/to/somefile
vim一个远程文件
python -m SimpleHTTPServer
一句话实现一个HTTP服务,把当前目录设为HTTP服务目录,可以通过http://localhost:8000
访问 这也许是这个星球上最简单的HTTP服务器的实现了。
history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[a] " " CMD[a]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
(陈皓注:有点复杂了,history|awk {print $2}|awk BEGIN {FS=”|”} {print $1}|sort|uniq -c|sort -rn|head -10)
这行脚本能输出你最常用的十条命令,由此甚至可以洞察你是一个什么类型的程序员。
-
tr -c “[:digit:]” ” ” < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR=”1;32″ grep –color “[^ ]“
想看看Marix的屏幕效果吗? (不是很像,但也很Cool!)
-
net rpc shutdown -I ipAddressOfWindowsPC -U username%password
远程关闭一台Windows的机器
- :w !sudo tee %
在vi中保存一个只有root可以写的文件
- date -d@1234567890
时间截转时间 - --没试验车成功
创建一个空文件, 比touch短。
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 13G 7.6G 4.2G 65% /
df 的-T参数就可以显示文件系统的类型,-h参数让其显示的更人性化。
@如何查看一个文件有多少行,多少个word,最长那行多少个字
如:wc -l filename 就是查看文件里有多少行
wc -w filename 看文件里有多少个word。
linux 如何显示一个文件的某几行(中间几行)
【一】从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
*注意两种方法的顺序
分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
【三】用sed命令
假如删除当前目录下最后修改时间是3小时以前的文件 find . -mmin 180 -print | xargs rm -rf 注意-mtime之后带的数字是以24小时为单位的
---(+n)----------|----------(n)----------|----------(-n)---
(n+1)*24H前| (n+1)*24H~n*24H间 |n*24H内
-ctime -n 查找距现在 n*24H 内修改过的文件
-ctime n 查找距现在 n*24H 前, (n+1)*24H 内修改过的文件
-ctime +n 查找距现在 (n+1)*24H 前修改过的文件
[a|c|m]min [最后访问|最后状态修改|最后内容修改]min
[a|c|m]time [最后访问|最后状态修改|最后内容修改]time
linux 文件的几种时间 (以 find 为例):
atime 最后一次访问时间, 如 ls, more 等, 但 chmod, chown, ls, stat 等不会修改些时间, 使用 ls -utl 可以按此时间顺序查看;
ctime 最后一次状态修改时间, 如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;
mtime 最后一次内容修改时间, 如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变.
注意: linux 里是不会记录文件的创建时间的, 除非这个文件自创建以来没有发生改变, 那么它的创建时间就是它的最后一次修改时间.
#ls -lt ./ 按修改时间顺序查看
#ls -lut ./ 按访问时间顺序查看
(如果想反序查看的话需要加一个选项 -r)
假如删除当前目录下最后修改时间是3小时以前的文件 find . -mmin 180 -print | xargs rm -rf 注意-mtime之后带的数字是以24小时为单位的
vi操作.
:n1,n2 m n3 移动n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 co n3 复制n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 d 删除n1-n2行(包括n1,n2)行;