1. 程式人生 > >Linux shell按行讀檔案

Linux shell按行讀檔案

寫在前面

這裡採用的測試檔案的內容如下:

$ cat read_test.txt 
1 a a,b,d,f
2 b alsdjf,apple,kdjf
3 c 163.2.201.1
4 d www.google.com
5 e http://blog.csdn.net/xia7139

另外,這裡的指令碼都會放在test.sh中執行,當然,我不說你也可以看出來^_^

Linux按行讀檔案的方法

Linux中按行讀檔案主要有三種方法,如下:

  1. 重定向

    while read line
    do
        echo $line
    done < read_test.txt
    
    $ sh test.sh 
    1 a a,b,d,f
    2 b alsdjf,apple,kdjf
    3 c 163.2.201.1
    4 d www.google.com
    5 e http://blog.csdn.net/xia7139
    
  2. 管道

    cat read_test.txt | while read line
    do
        echo $line
    done
    
    $ sh test.sh 
    1 a a,b,d,f
    2 b alsdjf,apple,kdjf
    3 c 163.2.201.1
    4 d www.google.com
    5 e http://blog.csdn.net/xia7139
    
  3. 反引號取命令執行結果

    for line in `cat read_test.txt`
    do
        echo $line
    done
    
    $ sh test.sh 
    1
    a
    a,b,d,f
    2
    b
    alsdjf,apple,kdjf
    3
    c
    163.2.201.1
    4
    d
    www.google.com
    5
    e
    http://blog.csdn.net/xia7139
    

總結:
這裡不難看出,第三種方式中,除了換行符,空格和tab等也會被當成“行”間隔,使用時應該注意。

同時讀入多個變數

Shell中可以將一中空格隔開的多個欄位,同時分別讀入多個變數,非常方便。程式碼如下:

cat read_test.txt | while read number char content
do
    echo "No.:$number char:$char content:$content"
done

$ sh test.sh 
No.:1 char:a content:a,b,d,f
No.:2 char:b content:alsdjf,apple,kdjf
No.:3 char:c content:163.2.201.1
No.:4 char:d content:www.google.com
No.:5 char:e content:http://blog.csdn.net/xia7139

也可以採用下面的方式,得到的效果完全相同:

while read number char content
do
    echo "No.:$number char:$char content:$content"
done < read_test.txt

實戰:檢視使用者及其所屬組的指令碼

Linux中的使用者資訊和組資訊都是以文字檔案的形式儲存在/etc/passwd/etc/group檔案中,通過讀取這些檔案,可以將使用者和它們的組資訊以更加友好的方式展現出來。下面是程式碼:

#!/bin/bash

#This is a script to list all users in the Unix system.
#Tested through under Bash.
#
#By lfqy.
#Finished on 20141220_1512
#
#Running step:
#chmod a+x user_print.sh
#./user_print.sh

#Print a table head with printf, String Left Aligning with fixed length.
printf "%-7s %-4s %-13s  %-15s\n" User UID "PrimaryGroup" "SecondaryGroup"
#Get the user info, user name, uid and gid, from /etc/passwd
awk -F: '$3>=500 {print $1,$3,$4}' /etc/passwd | while read user uid gid
do
    #Get the primary group name from /etc/group, using gid.
    priGro=`awk -F: '$3=="'$gid'" {print $1}' /etc/group`
    secGro=''

    #Get all the group not reserved for operating system.
    #For every group, test if it is the secondary group of $user.
    for gro_mem in `awk -F: 'BEGIN{OFS=":"}$3>="'$gid'" {print $1,$4}' /etc/group`
    do
        #Get the group member
        secMem=":${gro_mem#*:}"
        #Get the group name
        groName=${gro_mem%%:*}
        #Testing, ':' existing for the case lfqy and lfqy0
        if [[ $secMem = *",$user"* ]] || [[ $secMem = *":$user"* ]]
        then
            secGro=$secGro","$groName
            #echo "secGro:" $secGro
        fi
    done
    printf "%-7s %-4s %-13s  %s\n" $user $uid $priGro ${secGro#*,}
done

$ sh user_print_final.sh 
User    UID  PrimaryGroup   SecondaryGroup 
lfqy    500  lfqy   

執行環境:

CentOS
Release 6.4 (Final)
Kernel Linux 2.6.32-358.el6.x86_64
GNOME 2.28.2

上面的指令碼實際上是我好長時間之前練手寫的,現在看來有些命令的用法,我記得也不是特別清楚了。如有疑問,自行Google。

相關推薦

Linux shell檔案

寫在前面 這裡採用的測試檔案的內容如下: $ cat read_test.txt 1 a a,b,d,f 2 b alsdjf,apple,kdjf 3 c 163.2.201.1 4 d www.google.com 5 e http://blog.cs

linux shell讀取檔案

讀取檔案行 for 命令替換 程式碼塊重定向 while 管道符 程式碼塊重定向 for IFS=$'\n' for line in `ls -l` do (( count++ )) done echo $count 注意: for

shell檔案讀取, 分割成陣列

cut -d 如果找不到分割符號, 就會輸出原字串,無聊-f後面是什麼,加-s就什麼都不輸出了 #!/bin/bash # 從檔案中按行讀取,每行分割成字串, 形成陣列# j=0 while read line do i=1 while : do

Linux Shell讀取檔案 ( txt , sh , csv等)

     今天寫了一個簡單的 Linux Shell 逐行讀取檔案(txt,sh,csv....)的程式,記錄一下,有需要的朋友可以參考。 #!/bin/bash # Only 1 parameter ! if [ $# != 1 ];then echo " Usage

java指定編碼的寫txt檔案(幾種寫方式的比較)

輸入輸出的幾種形式 1.FileReader,FileWriter File r = new File("temp.txt") FileReader f = new FileReader(name);//讀取檔案name BufferedReader b = new Buf

python檔案

方法一:readline函式 #-*- coding: UTF-8 -*- f = open("/pythontab/code.txt") # 返回一個檔案物件 line = f.readline() # 呼叫檔案的 r

go檔案

2019年第一篇部落格 兜兜轉轉又回來更新go的部落格了,今天來講一下如何使用golang進行檔案的讀寫 檔案讀寫需要使用的包 os ioutil bufio strings 檔案讀寫總是少不了判斷檔案是否存在! go裡面使用os.Stat

shell指令碼讀取檔案並解析

shell指令碼讀取一個配置檔案,配置檔案的格式如下: name=abc pwd=123456 permission=mop 檔名稱為 config.cfg 要在shell腳本里讀取這個配置檔案,並且把值一一賦給相應的變數,實現如下 while read l

shell指令碼-----讀取檔案

[email protected]:5.read-line$ cat file.bin  hello world this is 1 this is 2 this is 3[email protected]:5.read-line$ ./read-line.sh file.bin  ###

Linux shell sed命令在檔案尾新增字元

昨天寫一個指令碼花了一天的2/3的時間,而且大部分時間都耗在了sed命令上,今天不總結一下都對不起昨天流逝的時間啊~~~ 用sed命令在行首或行尾新增字元的命令有以下幾種: 假設處理的文字為test.file 在每行的頭新增字元,比如"HEAD",命令如下: sed '

Java 檔案

按行讀寫檔案 /* * 按行進行讀寫處理 */ public void readWriteByLine(File input, File output, FileDeal fd) { Bu

Linux shell 命令下查詢外網IP

shell命令行查ip查詢IP在網頁上打開網址就可以顯示,但是在命令行下可以安裝w3m/Links/Lynx這些命令行瀏覽器,但是為了這個又感覺不方便,所以很多查IP網站提供了UNIX/LINUX的。命令行查詢(詳細): UNIX/Linux: #curl cip.cc Windows: >tel

linux shell 之終端寫文件數據流和重定向>,<,<<,>>

運行 文件的 方式 ech 描述符 run 傳遞 實例 pan 終端實現文件中數據流的讀寫; 重定向命令列表如下: 命令說明 command > file 將輸出重定向到 file。將終端數據寫到文件file中 command < file 將輸入重定

while循環文件的方式總結

log 字節數 toolbar tin als $? 總量 read 內容 分析apache訪問日誌,把日誌每行的訪問字節數對應的字段數字相加,計算訪問總量。#!/bin/bash sum=0 exec < $1 while read line do aa=`

java寫文件和輸入處理

gin path lines 一個 static apple OS puts oid 一、我們來看python的很簡單: 1、讀文件: 1 with open("/path/file","r") as fr: 2 for line in fr.readlines(

Linux shell計算兩個檔案的交集 並集和差集

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux Shell 指令碼讀取配置檔案

一、應用場景 為了靈活應用shell指令碼,適當的加入配置檔案,對於後期的維護和優化會有很大幫助。例如指令碼中使用的檔案/檔案路徑,都可以通過讀取配置檔案完成。 配置檔案 filename=boomlee 指令碼檔案 #!/bin/bash workdir=$(cd $(di

C 讀取檔案(但是最後一行會多輸出一行)

#include <stdio.h>   int main()  {      char filename[] = "E:\\data_test\\commands.txt"; //檔名   &nb

python判斷檔案中有否重複,逐檔案檢測另一檔案中是否存在所內容

#!/bin/env python # coding:utf-8 #程式功能是為了完成判斷檔案中是否有重複句子 #並將重複句子打印出來 res_list = [] f = open('./downloadmd5.txt','r') res_dup = [] index = 0 file_d

java讀取檔案並對檔案進行加密和解密

package com.alibaba.datax.plugin.reader.selfxmlfilereader.util; import java.io.UnsupportedEncodingException; import java.security