Just don't create that many subprocesses. Your objective is to prepare a string of `INSERT` statements and feed it to one invocation of `sqlite3`. So drop the whole `while read` block and do the required text manipulations on the queried `passwd` entries before passing them off to `sqlite3`: #!/bin/sh db='./users.db' sqlite3 "$db" <<EOF DROP TABLE Users; CREATE TABLE Users \ (UID INTEGER PRIMARY KEY, GID INTEGER, Username TEXT, Home TEXT); $(getent passwd 'joe' 'bill' 'tom' | awk -F':' -v quote="'" -v OFS="', '" \ '{print "INSERT INTO Users VALUES ("quote $3, $4, $1, $6 quote");"}') EOF Doing a `grep` on `/etc/passwd` has a few drawbacks: the `passwd` file might not be located in `/etc` (I don't know of any Unix-like OS for which this is true, though), and it won't have the users that are stored in LDAP/NIS, etc. On the other hand, some systems don't have `getent`, so this method is not perfect, either. You might want to fall back to `grep` if `getent` returns a "command not found".