希望所有的线都有一个命令 - IFS

时间:2012-11-24 12:50:17

标签: linux bash

我有一个脚本在/ etc / passwd中重写一行的UID,但仅当UID> 500.它的工作但是......我想用一个命令来重写所有的线路,我不知道它是否可能。

让我告诉你我的代码:

#!/bin/bash
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
  if [ $f3 -gt 500 ]
  then
     echo "$f1:$f2:$f3:$f4:$f5:$f6:$f7"  <<< there is a single command for that ?
  fi
done < /etc/passwd

感谢您的回复:)

4 个答案:

答案 0 :(得分:3)

尝试

awk -F: '$3>=500 {print $0}' /etc/passwd

答案 1 :(得分:1)

使用数组:

#!/bin/bash
while IFS=: read -r -a f; do
  if (( ${f[2]} > 500 )); then
     IFS=: b="${f[*]}"
     echo "$b"
  fi
done < /etc/passwd

答案 2 :(得分:0)

我会将整行读入一个变量,然后在循环中拆分。

while read line; do
    old=IFS
    IFS=:
    set -- $line
    IFS=$old
    test $3 -gt 500 || continue
    printf "%s\n" "$line"
done </etc/passwd

答案 3 :(得分:0)

bash解决方案:

while read  line
do
  arr=(${line//:/ })
  [ ${arr[2]} -gt 500 ] && echo $line
done < /etc/passwd

将整个记录拆分成一个数组并检查包含user-id的第二个索引元素。

相关问题