如何学习Linux命令-初级篇

首先声明,本人也是菜鸟,整理这篇博客只是为了记录自己学习Linux命令的一些心得,各路高手拍砖请手软。
也许作为一个刚入门的Linux新手,在众多的Linux发行版本面前,难免会眼花,有大把时间倒腾的同学,肯定不止在两个版本中游走过,不过大部分人首先体验到的还是桌面环境,毕竟我们中很多人还是从windows接触到计算机的,想要进步同学肯定抵不Linux命令的诱惑,于是在网上搜索各种命令,或者在使用中遇到问题后,放狗一搜就能找到解决方案。
当你已经把玩Linux一段日子后,会发现貌似你已经使用过很多命令了,但是让你回忆,你又说不上几个来(特别是面试的时候),这时候你应该吃一点鸟哥私房菜了。
当你对Linux的发展历史有一定了解的时候,你应该明白在Linux其实最基本的就是:Kernel + GNU工具,由于不同的Linux发行版本由不同的团队开发,一些是商业公司,比如红帽子,一些纯粹由社区维护(例如:Debian),他们在自己的发行版本中添加了一些独特工具,导致了不同的Linux发行上有着一些不同的命令,但是GNU提供的工具是最通用的,如果你懂C语言,那么就更好了,下载GNU下面的coreutils,这里一共有100多个命令,这些命令基本上是所有Linux发行版本上都具有的,同时还带有源码,这绝对是一个提高自己的机会。
作为一个普通的Linux使用人员(我是指你不是开发linux内核或者Linux底层应用的开发人员),那么把这100多个命令使用得炉火纯青,那么Linux能给你带来很大的帮助,当然100多个命令,难免还是有点让人头晕,于是网上有人对这些命令做了一个分类,这是很好的一种方式,比如把命令分为:文件管理,文件传输,磁盘管理,用户权限管理,等等,我建议当你使用一段时间Linux后,对这些众多的命令按照这样的分类,列出一个属于自己的列表,学会一个新命令就加到自己的列表上。
不过命令让很多人却步主要还是各种参数的使用,我相信很多一入门的同学,肯定都知道搞不明白的就找男人(man),但是用man查看后,更茫然了,各种参数描述,根据个人经验,其实很多linux命令还是有很多规律可寻,比如 –h,-h,–help,这就是查看命令使用说明的参数,基本上每个命令都有这样的参数(所以如果有一天你编写的工具也应该有帮助)。

其实所谓Linux命令很难的说法,根源还是所学知识没有投产,你如果仅仅是玩玩linux命令,那么几个月后,你肯定会忘记一大半,你要思考那些牛人为什么开发这个工具,这肯定是有需求的,我觉得普通开发人员(像我这样的人)使用Linux就是因为在现实生活中会用到很多Linux的小工具,比如Linux下面的文本处理 awk,sed,等等,假设有一个需求:为一个文本日志文件加上行号(假设你是java程序员),你是不是打开eclipse(或许你是editplus)开始coding,no,其实你只需要awk完成这个任务,所谓牛人就是能熟练地运用所学知识,而不仅仅是一味的学习。

总之你不要惧怕,当然也千万不要认为会使用100多个Linux命令就能行走江湖了,你应该好高鹜远,看看 http://www.commandlinefu.com/commands/browse ,这样的网站。

Ubuntu 11.10外接显示器遇到的问题

因为自己用的T61笔记本,总感觉显示太小,于是在公司就使用外接显示器,一方面双屏可以提高效率,而且大显示器看着也舒服,但回到家中就不能用外接现实器了,有时候在公司也会连接投影仪,前不久发现一个问题,接上外部显示器开机,出现以下提示:

后来回想起来,在台式机的Ubuntu 11.04的时候也出现过这样的情况。
google一翻,大概明白了原因.
Ubuntu在开机进入桌面的时候,会调用gnome-setting-deamon 这个程序,这个程序调用当前用户的一些设置,比如字体,显示器,开机运行的程序,等等。
Could not apply the stored configuration for monitors
上面这个弹出窗口的意思是,不能应用当前monitor的设置,也就是显示器的设置有错误。
个人分析,因为我在公司使用的是双屏幕现实,在显卡自己做了设置,在关机的时候,gnome-setting-deamon 会保存上一次的设置,生成一个monitors.xml的文件。在用户目录下$user.home/.config/monitors.xml,要解决上面的问题,最简单的办法就是删除这个monitors.xml文件,重启一下电脑.

一个常见的算法题目

/**
* 假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,
* 比如:abcda和adabc,由于出现的字符个数都是相同,
* 只是顺序不同,所以这两个字符串是匹配的,
* 要求高效.
*/
public class CompareString{
    public static void main(String args[]){
       System.out.println(compare(args[0],args[1]));
    }
    public static char[] copyNew(char[] src,int exclude){
        char[] n = new char[src.length-1];
        int i=0,j=0;
        for(; i<src.length ;i++){
            if(i != exclude){
                n[j] = src[i];
                j++;
            }
        }
        return n;
    }

    public static boolean compare(String str1,String str2){
        char [] char1 = str1.toCharArray();
        char [] char2 = str2.toCharArray();
        if(char1.length != char2.length ){
            return false;
        }
        char[] _char = new char[char1.length];
        char[] tmp = char2;
        for(int i=0;i< char1.length;i++){
            int j=0;
            for(;j< tmp.length;j++){
                if(char1[i] == tmp[j]){
                   tmp = copyNew(tmp,j);
                   //处理下一个
                   break;
                }
                if(j == tmp.length-1){
                  //在第二个数组没找到相同的
                   return false;
                }
            }
        }
        return true;
    }
}
//=================
这道题有一个陷阱,上面这个解法显然不是高效的,我从编程之美中学到一个思路,
就是通过比较字符串对应的ASCII码的和,来判断

public class CompareString{
    public static void main(String args[]){
       System.out.println(compare(args[0],args[1]));
    }
    public static boolean compare(String str1,String str2){
        char [] char1 = str1.toCharArray();
        char [] char2 = str2.toCharArray();
        if(char1.length != char2.length ){
            return false;
        }
        int sum1=0,sum2=0;
        for(char c:char1){
            sum1 = sum1+(int)c;
        }
        for(char c:char2){
            sum2 = sum2+(int)c;
        }
        if(sum1 == sum2){
            return true;
        }
        return false;
    }
}
</pre>

算法小练

1.统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数

import java.io.*;
import java.util.*;
import java.lang.*;
/**
*   统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数
*/
public class TextStatisticsMain{
    public static void main(String args[]){
        TextStatisticsMain tm = new TextStatisticsMain(args[0]);
        tm.print();
    }
    private List textStatistics = new ArrayList();
    private String rootPath;
    public TextStatisticsMain(String file){
        this.rootPath = file;
    }

    public void print(){
         statistics(new File(this.rootPath));
          System.out.println("==== Statistics ====");
          System.out.println("                     ");
        for(TextStatistics t:textStatistics){
            System.out.println("File: "+t.getFileName());
            System.out.println("letCount: "+ t.getLetCount());
            System.out.println("numCount: "+ t.getNumCount());
            System.out.println("spaceCount: "+t.getSpaceCount());
            System.out.println("lines: "+t.getLines() );
            System.out.println("----------------------------");
        }
    }
    private  void statistics(File file){
        if(file.isDirectory()){
        //是目录
            for(File f:file.listFiles()){
                statistics(f);
            }
        }else{
        //是文件
          try{
            FileReader fread = new FileReader(file);
            BufferedReader lnf = new BufferedReader(fread);
            String b;
            String fileName = file.getPath();
            int letCount=0, numCount=0,spaceCount=0, lines=0;
            while ((b = lnf.readLine()) != null) {
                lines++;
                for(char c:b.toCharArray()){
                  //对比ASCII码
                  if((int)c>=48 && (int)c<=57){
                  //是数字
                   numCount++;
                  }else if((int)c==32){
                  //空格
                    spaceCount++;
                  }else if((int)c>=65 && (int)c<=90){
                  //大写字母
                    letCount++;
                  }else if((int)c>=97 && (int)c<=122){
                  //小写字母
                    letCount++;
                  }
                }
            }
                textStatistics.add(new TextStatistics(fileName,letCount,numCount,spaceCount,lines));
            }catch(Exception e){
                System.out.println(e);
            }

        }
    }
}
public class TextStatistics{
    private String fileName;
    private int letCount;
    private int numCount;
    private int spaceCount;
    private int lines;
    public TextStatistics(String fileName,int letCount,int numCount,int spaceCount,int lines ){
        this.fileName=fileName;
        this.letCount=letCount;
        this.numCount=numCount;
        this.spaceCount=spaceCount;
        this.lines=lines;
    }
    public String getFileName(){
        return this.fileName;
    }
    public int getLetCount(){
        return this.letCount;
    }
    public int getNumCount(){
        return this.numCount;
    }
    public int getSpaceCount(){
        return this.spaceCount;
    }
    public int getLines(){
        return this.lines;
    }

}

2.现在一个表,有姓名、性别、年龄,字段分别为varchar(20),varchar(20),int,
现有表中已经有上百万条记录了,在姓名上建索引,现在有一个文本文件,已经格式化为姓名、性别、年龄,写一个函数,
怎么样一次性的将该文件中的数据以最快的速度导入到数据库中。
如有函数,实现该函数:
save(Connection c,File f)
{
//直接导入文件就行了,大概思路就是这样
Statement s = c.createStatement();
s.execute("LOAD DATA INFILE '"+f.getPath()+"' INTO TABLE tablename fields terminated by ',' lines terminated by '\n'");
}

[收藏] LINUX下的21个特殊符号

1. > 重定向输出符号。
2. >> 重定向输出符号,但有追加的功能。
3. 2> 错误重定向输出符号,覆盖原文件内容。
4. 2>> 错误重定向输出符号,有文件内容追加的功能。
5. * 匹配任意字符。
6. 匹配任意一个字符。
7. | 管道符号。
8. & 后台进程符。
9. &&l 逻辑与符号。用法:命令1 && 命令2 表示如果命令1执行成功,继续执行命令2。
10. || 逻辑或符号。用法:命令1 | | 命令2 表示如果命令1执行成功,不执行命令2;但如果命令1执行失败才执行命令2。
11.逻辑非符号。排除指定范围。
12. [x-y] 表示一定的范围。
13. # 注释符。
14. ” ” 双引号表示把它所包含的内容作为普通字符,但` ` $ \ ‘ ‘ 几个符号除外。
15. ’ ’ 单引号表示把它所包含的内容作为普通的字符,无特殊例外。
16. $ 变量符。
17. \ 转义字符。
18. ’ ’ 倒引号,表示它所包含的内容。
19. 命令分隔符。
20. < 重定向输入符。
21. () 表示整体执行命令。

Page 1 of 1012345»...Last »